如何用一个小数显示百分比并用C#中的string.Format管理文化?

时间:2015-05-21 13:57:57

标签: c# .net format percentage string.format

我想显示百分比并管理文化。 像这样:https://msdn.microsoft.com/fr-fr/library/system.globalization.numberformatinfo.percentnegativepattern%28v=vs.110%29.aspx

我这样做:

double percentage = 0.239;
NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
string percentageValue = string.Format(nfi, "{0:P1}", percentage);

它有效(例如结果可以是"%23,9"或" 23,9%")

但如果不需要,我不想显示小数 => " 100%"而不是" 100,0%"。

我尝试#。#,它的作品,但我想管理当前的文化(小数点分隔符,百分比位置等)。

我怎样才能做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:2)

格式中的句点(.)实际上是替换字符:文化的小数分隔符 1 。请参阅MSDN上的here

这部分很容易。

但是,P格式的小数位数基于适用区域设置中的详细信息,没有自定义格式的"百分比数字"。

此外

  

但我不想显示小数,如果不是neede

对于浮点值非常困难。作为近似值,任何类似if (value.FractionalPart == 0)之类的尝试都注定了基础二进制表示。例如,0.1(10%)未准确表示,并且在乘以100(对于百分比显示)之后不可能精确为10.因此"没有小数位"实际上需要"足够接近整数值":

var hasFraction = Math.Abs(value*100.0 - Math.Round(value*100, 0)) < closeEnough;

然后根据结果构建格式字符串。

1 即。如果你想要一个独立于文化的时期你需要引用它 - 用单引号 - 例如。 value.ToString("#'.'##")

答案 1 :(得分:0)

Standard Numeric Format Strings

  

&#34; P&#34;或&#34; p&#34; (百分比):

     
      
  • 结果:数字乘以100并以百分号显示。
  •   
  • 支持者:所有数字类型。
  •   
  • 精确说明符:所需的小数位数。
  •   
  • 默认精度说明符:由NumberFormatInfo.PercentDecimalDigits定义。
  •   
     

更多信息:百分比(&#34; P&#34;)格式说明符。

     
      
  • 1(&#34; P&#34;,en-US) - &gt; 100.00%
  •   
  • 1(&#34; P&#34;,fr-FR) - &gt; 100,00%
  •   
  • -0.39678(&#34; P1&#34;,en-US) - &gt; -39.7%
  •   
  • -0.39678(&#34; P1&#34;,fr-FR) - &gt; -39,7%
  •   

NumberFormatInfo.PercentDecimalDigits包含以下示例:

NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;

// Displays a negative value with the default number of decimal digits (2).
Double myInt = 0.1234;
Console.WriteLine( myInt.ToString( "P", nfi ) );

// Displays the same value with four decimal digits.
nfi.PercentDecimalDigits = 4;
Console.WriteLine( myInt.ToString( "P", nfi ) );

导致输出结果:

  • 12.34%
  • 12.3400%

答案 2 :(得分:0)

好的,谢谢,因为string.Format()

是不可能的

你怎么看待这个?

bool hasDecimal = !percentage.Value.ToString("P1", CultureInfo.InvariantCulture).EndsWith(".0 %");
string percentageMask = hasDecimal ? "{0:P1}" : "{0:P0}";
string percentageValue = string.Format(CultureInfo.CurrentCulture, percentageMask, percentage);