NumberFormatInfo可以使用有效数字吗

本文关键字:有效数字 可以使 NumberFormatInfo | 更新日期: 2023-09-27 18:29:35

我在C#.NET WinRT应用程序中使用System.Globalization.NumberFormatInfo对我的数字进行格式化,除一个例外,一切都按预期进行。

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

在目标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

NumberFormatInfo可以使用有效数字吗

我一开始只是使用.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);