NumberFormatInfo可以使用有效数字吗?

时间:2016-01-09 21:24:12

标签: c# windows-runtime number-formatting

我正在使用System.Globalization.NumberFormatInfo在我的C#.NET WinRT应用程序中格式化我的数字,并且事情按预期工作,但有一个例外。

也就是说,我需要一种方法让格式化程序尊重我格式化的数字的有效数字

在Objective C中,我使用了NSNumberFormatter.UsesSignificantDigits,如下所述: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNumberFormatter_Class/index.html#//apple_ref/occ/instp/NSNumberFormatter/usesSignificantDigits

但是,NumberFormatInfo似乎没有与此功能相对应的任何内容。 NumberDecimalDigits属性似乎只占用一个数字,不考虑格式化的数字(这是我想要的所有时间我尝试格式化同时尊重重要性位) https://msdn.microsoft.com/en-us/library/windows/apps/system.globalization.numberformatinfo(v=vs.105).aspx

我可以使用NumberFormatInfo来解决这个问题吗,还是我必须使用NumberFormatInfo之外的其他东西来格式化我的数字?如果我需要做其他事情,最好的方法是什么?

例如,我希望以下方式格式化以下数字:

  • 2.5 - > 2.5
  • 3 - > 3
  • 4.3333333 - > 4.3333333
  • 3.66666 - > 3.66666

而不是以下

  • 2.5 - > 2.50
  • 3 - > 3.00
  • 4.3333333 - > 4.33
  • 3.66666 - > 3.67

1 个答案:

答案 0 :(得分:0)

我开始只使用.ToString(),但我想确保我的小数点分隔符,分组分隔符等都正确使用,所以我最终以这种方式实现它,我就是这样对结果非常满意。

value是我试图格式化的double

CultureInfo culture = this.CurrentCulture;
string decimalSeparator = culture.NumberFormat.NumberDecimalSeparator;
string temp = value.ToString();
string[] splitter = temp.Split(decimalSeparator[0]);
int numDigitsToDisplay = 0;
if( splitter.Length > 1)
{
    numDigitsToDisplay = splitter[1].Length;
}
numDigitsToDisplay = Math.Min(10, numDigitsToDisplay); // Make sure no more than 10 digits are displayed after the decimal point
NumberFormatInfo tempNFI = (NumberFormatInfo)culture.NumberFormat.Clone();
tempNFI.NumberDecimalDigits = numDigitsToDisplay;
double roundedValue = Math.Round((double)value, numDigitsToDisplay, MidpointRounding.AwayFromZero); // just in case the number's after-decimal digits exceed the maximum I ever want to display (10)
return roundedValue.ToString("N", tempNFI);