簡體   English   中英

wpf字符串格式c#用於測量單位

[英]wpf string format c# for measurement units

我正在使用MVVM模式和Entity Framework來創建一個應用程序。 我有一個名為ScaleRange的實體,它具有以下屬性:UpperRange(以克或毫克為單位,整數類型),LowerRange(以克或毫克為單位,整數類型)和精度(以克或毫克為單位,十進制類型)。 我以克為單位將所有屬性保存在數據庫中(或者我應該?)。 問題是當我需要在DataGrid中顯示ScaleRange列表時,所有屬性都以克表示(因為數據是從數據庫中提取的),並且在某些情況下值為0.0001(以克為單位)我更喜歡為了更好看的毫克(在這種情況下為0.1)。 是否存在某種字符串格式,例如,如果值<0.01,則以毫克顯示,否則以克為單位顯示?

這是DataGrid的代碼(現在工作正常)

<DataGrid Grid.Column="3" Grid.Row="1" Grid.RowSpan="4" AutoGenerateColumns="False" ItemsSource="{Binding Scale.Ranges}" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Upper range" Width="*" Binding="{Binding UpperRange, StringFormat={}{0}g}"></DataGridTextColumn>
            <DataGridTextColumn Header="Lower range" Width="*" Binding="{Binding LowerRange, StringFormat={}{0}g}"></DataGridTextColumn>
            <DataGridTextColumn Header="Precision" Width="*" Binding="{Binding Precision, StringFormat={}{0}g}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

我創建了這個轉換器,它適用於單位前綴G,M,K,m,μ,n

它沒有經過徹底的測試,所以讓我知道任何問題,只需仔細檢查你的值是否符合預期。

class GramToAppropriateUnitPrefixConverter : IValueConverter
{
    private List<string> unitsPrefix = new List<string>() //unit prefixes scalings by *10^3 in order, where the middle value is = *10^0
    {
        "G",
        "M",
        "k",
        "",
        "m",
        "μ",
        "n"
    };

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value is double number)
        {
            string numAsString;
            int sigFigs = 3;
            string unit = "g";
            int noPrefixIndex = (unitsPrefix.Count / 2);
            int unitsPrefixIndex = noPrefixIndex;

            numAsString = number.ToString("G" + sigFigs.ToString()).Replace("+", ""); //Convert to $sigFigs number of significant figures
            string[] numberStandForm = numAsString.Split('E'); //Convert to standard form (number = [0] * 10^[1])

            if (numberStandForm.Count() == 2)
            {
                unitsPrefixIndex = noPrefixIndex +(int.Parse(numberStandForm[1]) / 3);

                //Check the index is not out the range of the list
                if (unitsPrefixIndex < 0)
                    unitsPrefixIndex = 0;
                else if (unitsPrefixIndex > unitsPrefix.Count - 1)
                    unitsPrefixIndex = unitsPrefix.Count - 1;

                //Change the standard form number so it is in the form ->   number * 10^(multipul of 3)
                var power = int.Parse(numberStandForm[1]) + ((unitsPrefixIndex - noPrefixIndex) * 3);
                string numberStr = (double.Parse(numberStandForm[0]) * Math.Pow(10, power)).ToString();
            }

            numAsString = numberStandForm[0] + unitsPrefix[unitsPrefixIndex] + unit;

            return numAsString;
        }

        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

}

您可以使用轉換器, 是一個快速概述。
Convert功能中,您可以添加邏輯以確定值是否<0.1並相應地修改它。
你真的不需要ConvertBack函數,因為它是一個單向綁定。

如果讓值轉換器類派生自MarkupExtensionYourConverter : MarkupExtension, IValueConverter )並覆蓋ProvideValue函數,就像這樣

public override object ProvideValue(IServiceProvider serviceProvider)
{
     return this;
} 

您可以將XAML代碼中的集成簡化為{Binding Converter={conv:YourConverter} ,而不必首先將轉換器定義為資源。
您還必須添加對轉換器命名空間的引用,在我的示例中為conv:例如xmlns:conv="clr-namespace:Content.Common.Converter" )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM