双ToString保持"en-US"格式

Double ToString keeping "en-US" format

本文关键字:quot 格式 en-US ToString 保持      更新时间:2023-09-26

听起来很简单-我知道它是…但我有问题,不知道究竟为什么…

我有一个web应用程序全球化(多语言)。当我单击更改语言时,这是我的操作:

public ActionResult ChangeCulture(string lang)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
    var languageCookie = new HttpCookie("_language") { Value = lang, Expires = DateTime.UtcNow.AddYears(1) };
    Response.Cookies.Remove("_language");
    Response.SetCookie(languageCookie);
    return Redirect(Request.UrlReferrer.PathAndQuery);
}

我有一个页面显示一些字符(我使用chart.js),我需要绑定一个List<double>到javascript数组。

所以这个列表看起来像:

var list = new List<double> {144, 0, 540.23};

和我需要一个简单的数组在javascript:

var arr = [144, 0, 540.23];

我是这样做的(剃刀):

var arr = [@string.Join(",", Model.ListWithDoubles.Select(x => Convert.ToString(x, new CultureInfo("en-US"))))]

问题是:

当我使用英语的时候,它的效果很好。其他语言给我的是整数…

var arr = [144, 0, 540.23]; //en-US
var arr = [144, 0, 54023]; //pt-BR 
var arr = [144, 0, 54023]; //it
var arr = [144, 0, 54023]; //es

  1. 为什么?
  2. 如何修复?

因为在其他一些非en-US文化中,,.具有完全相反的含义和用法。如果不显示此数据,仅用于图表目的,则使用CultureInfo。将双精度类型转换为HTML的字符串表示形式时。您应该只在希望实际可视地向用户显示该数据值时转换为特定区域性字符串。

var arr = [@string.Join(",", Model.ListWithDoubles.Select(x => Convert.ToString(x, CultureInfo.InvariantCulture)))]

double的默认格式说明符是G,因此它将只创建带有十进制分隔符的输出。因为您想要原始数字(未为显示而格式化),那么您需要传递的是this (CultureInfo.InvariantCulture),而不是仅用于显示的区域性格式化字符串表示形式。


为了说明我所发布的代码无论当前线程的文化如何都可以工作,这里是该代码。将其放入控制台应用程序中,替换Main方法并运行它。您将看到这是有效的。你的问题在别处,而不是这段代码。

static void Main(string[] args)
{
    var cultures = new[] {"en-US", "pt-BR", "it", "es"};
    var list = new List<double> {144, 0, 540.23};
    Console.WriteLine("Without specifying a culture");
    foreach (var culture in cultures.Select(isoCulture => new CultureInfo(isoCulture)))
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = culture;
        System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
        Console.WriteLine("Culture: " + culture.Name);
        Console.WriteLine("Not defined:                  " + string.Join(",", list.Select(x => Convert.ToString(x))));
        Console.WriteLine("CultureInfo.InvariantCulture: " + string.Join(",", list.Select(x => Convert.ToString(x, CultureInfo.InvariantCulture))));
    }
    Console.ReadLine(); // stops so you can see the results
}