十进制ToString F02变成逗号

本文关键字:ToString F02 十进制 | 更新日期: 2023-09-27 18:08:08

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

decimal urmom = 84.3400m;
Console.WriteLine(urmom.ToString("F02"));
我得到84.34

在我正在运行的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

为什么?十进制只是一个值,对吧?它不是具有某些隐藏属性的引用对象,这些属性可能已被某些区域性信息损坏…对吧?

十进制ToString F02变成逗号

这与正在运行的线程的区域性有关。如果你想让字符串格式化成en-US格式,而不管线程是什么,那么你需要传递一个特定的区域性给ToString。如果它在web服务器下运行,而你想忽略请求浏览器/客户端的区域性,你也可以在web.config中指定一个静态区域性。

如何在ToString中指定区域性

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

看到小数。ToString方法(String,IFormatProvider)

如何配置web.config

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

请参见如何:设置ASP的区域性和UI区域性。. NET网页全球化


为什么?十进制只是一个值,对吧?

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

检测调用者的区域性通常是一件好事,返回基于调用者区域性格式化的数据通常也是期望的行为。如果没有,那么请参考上面的两种方法来确保代码始终可以返回一致的格式化数据。

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

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