【问题标题】:How to change symbol for decimal point in double.ToString()?如何更改 double.ToString() 中小数点的符号?
【发布时间】:2010-06-28 19:39:00
【问题描述】:

我想在 C# 中将小数点更改为另一个字符。我有一个double 变量value

double value;

当我使用命令时:

Console.WriteLine(value.ToString()); // output is 1,25

我知道我能做到:

Console.WriteLine(value.ToString(
    CultureInfo.CreateSpecificCulture("en-GB"))); // output is 1.25

但我不太喜欢它,因为它很长,而且我的程序中经常需要它。

是否有更短的版本可以将“小数点”设置为点,而不是像我的文化中通常的逗号那样?

【问题讨论】:

  • 使用:Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("zh-CN");并且此线程中的所有 xyz.ToString() 都将使用您想要的格式。

标签: c# .net double tostring


【解决方案1】:

一些捷径是创建一个 NumberFormatInfo 类,将其 NumberDecimalSeparator 属性设置为“。”并在需要时使用该类作为 ToString() 方法的参数。

using System.Globalization;

NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";

value.ToString(nfi);

【讨论】:

  • 我更喜欢这种方法,因为它独立于语言!
【解决方案2】:

创建扩展方法?

Console.WriteLine(value.ToGBString());

// ...

public static class DoubleExtensions
{
    public static string ToGBString(this double value)
    {
        return value.ToString(CultureInfo.GetCultureInfo("en-GB"));
    }
}

【讨论】:

  • 也许有人投了反对票,因为虽然这很吸引人,但可以通过全局设置文化信息以更漂亮的方式完成。顺便提一句。我不是反对者。 :)
  • @Thomas:确实,虽然当 OP 说 “我的程序中经常需要它” 时,我将其解释为类似于 “经常但不是每次”.
  • @ThomasTeilmann 也许有人投了反对票,因为他们是文盲。这是一个清晰、简单、易读的答案。
【解决方案3】:

也许我误解了你的问题的意图,如果我错了,请纠正我,但你不能在全球范围内应用文化设置一次,然后不用担心自定义每个 write 语句吗?

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");

【讨论】:

  • 好吧,我在整个程序中不需要它,我需要它来适应 WPF 中 PathGeometry 的格式,其中需要小数点。但事实证明,这种解决方案不会伤害其他任何东西。谢谢!
  • @womp 更好的答案!如果我将它设置为我的主线程,这是否也适用于子线程?我想将此设置应用于我的程序集的整个执行时间。
【解决方案4】:

您可以通过更改用于显示数字的区域性来更改小数点分隔符。但是请注意,这将改变有关数字的所有其他内容(例如,分组分隔符、分组大小、小数位数)。从您的问题来看,您似乎默认使用逗号作为小数分隔符的文化。

要更改小数分隔符而不更改文化,您可以修改当前文化的NumberFormatInfoNumberDecimalSeparator 属性。

Thread.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";

这将修改线程的当前文化。现在所有输出都将被更改,这意味着您只需使用value.ToString() 即可输出您想要的格式,而不必担心每次输出数字时都会更改文化。

(请注意,neutral 区域性不能更改其小数分隔符。)

【讨论】:

  • 如果您尝试这样做,您会收到“实例为只读”错误。
  • @MariusStanescu 我认为只有在使用中性文化时才会发生这种情况,正如阿德里安班克斯在回答末尾所指出的那样。
  • @patrickbadley 我刚刚尝试了这个解决方案并遇到了“只读”错误。在“观察窗口”中添加“Culture.IsNeutralCulture”清楚地表明该文化不是中性的。但是,我也注意到它是只读的。克隆文化似乎是解决这个问题的正确方法。请参阅以下answer
【解决方案5】:
Convert.ToString(value, CultureInfo.InvariantCulture);

【讨论】:

    【解决方案6】:

    如果你有一个Asp.Net web应用,也可以在web.config中设置,这样整个web应用都一样

    <system.web>
        ...
        <globalization 
            requestEncoding="utf-8" 
            responseEncoding="utf-8" 
            culture="en-GB" 
            uiCulture="en-GB" 
            enableClientBasedCulture="false"/>
        ...
    </system.web>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多