Double ToString keep" en-US"格式

时间:2016-10-11 19:38:35

标签: javascript c# asp.net-mvc-4 globalization

听起来很简单 - 而且我知道这是......但我遇到了问题并且不知道为什么......

我有一个全球化的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中需要一个simples数组:

var arr = [144, 0, 540.23];

以下是我正在做的事情(razor):

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

问题是:

当我使用英语时,它的作品很漂亮。其他langues给我整数而不是......

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. 如何解决?

1 个答案:

答案 0 :(得分:0)

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

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

double的默认格式说明符是G,因此它将仅使用小数分隔符创建输出。如您所希望的原始数字(未格式化显示),则此(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
}