十进制 ToString F02 变成逗号

Decimal ToString F02 becomes Comma

如果我打开一个控制台应用程序并且运行这个:

decimal urmom = 84.3400m;
Console.WriteLine(urmom.ToString("F02"));

我得到84.34

在我 运行ning 的 Web 应用程序中,我有以下代码:

public static string PayPalJunk(string successURL, string failureURL, decimal total, string currency)
{
    NVPCodec encoder = new NVPCodec();
    encoder["PAYMENTREQUEST_0_AMT"] = total.ToString("F02");
    //...
}

即使我在执行该行之前中断并在 total.ToString("F02") 上执行 Watch,我也会得到 84,34。参数列表中total鼠标悬停显示84.34.

为什么? decimal 只是一个值,对吧?它不是具有某些可能已被某些文化信息损坏的隐藏属性的参考对象...对吗?

您得到这些结果是因为两种环境中的文化不同。试试这个:

encoder["PAYMENTREQUEST_0_AMT"] = total.ToString("F02", System.Globalization.CultureInfo.InvariantCulture);

或您希望将字符串格式化为的任何文化。

这与运行 的线程文化有关。如果你想获得 en-US 格式的字符串而不考虑线程,那么你需要将特定的区域性传递给 ToString。如果它 运行 在 Web 服务器下并且您想忽略请求 browser/client 的文化,您还可以在 web.config.

中指定静态文化

如何在 ToString

中指定文化
var formatted1 = total.ToString("F02", System.Globalization.CultureInfo.InvariantCulture);
// or
var formatted2 = total.ToString("F02", new System.Globalization.CultureInfo("en-US"));

Decimal.ToString Method (String,IFormatProvider)

如何配置web.config

<globalization uiCulture="en" culture="en-US" />

另见 How to: Set the Culture and UI Culture for ASP.NET Web Page Globalization


Why? decimal is just a value, right?

不,您正在将小数转换为字符串,并且根据区域性,代表小数的字符串可能会以不同方式显示。例如:在荷兰,逗号用于将整个值与值的 partial/fractional 部分分隔开,句点 (.) 用于分隔分组,如千、百万、十亿、万亿等。在美国这些符号的含义完全相反。

检测调用者的文化通常是一件好事,return根据调用者的文化格式化数据通常也是需要的行为。如果不是,那么请参阅上面的 2 种方法来确保代码始终 return 一致的格式化数据。