NumberFormatInfo 可以使用有效数字吗?
Can NumberFormatInfo use significant digits?
我正在使用 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
我一开始只是使用 .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);
我正在使用 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
我一开始只是使用 .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);