javascript - 双 ToString 保持 "en-US"格式

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

听起来很简单 - 我知道它是......但我遇到了问题,不知道到底为什么......

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

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 ),我需要绑定(bind) List<double>到 JavaScript 数组。

所以这个列表看起来像:

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

我需要一个 JavaScript 中的简单数组:

var arr = [144, 0, 540.23];

这是我的做法( Razor ):

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.InvariantCulture将 double 转换为 HTML 的字符串表示形式时。您应该只在您想要实际直观地向用户显示该数据值时转换为特定于区域性的字符串。

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
}

关于javascript - 双 ToString 保持 "en-US"格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985345/

相关文章:

javascript - 检查事件在路由 Angular 后引发两次

c# - 如何使用 `PlaceHolder` 代替 `HtmlTableRow` 或 `HtmlTableCell` ?

.net - 如何防止类中的属性不存储在 session 中

c# - 优化在asp.net mvc 4中将大数据集加载到表中

javascript - 在多选列表中设置选定值

javascript - 检查所有控制表

javascript - 动态选择产品变体,比较 2 个阵列

c# - 标记枚举与常规枚举的 HashSet

c# - 无法在 C# 中反序列化 JSON 结果。输入字符串格式不正确错误

c# - Telerik 报告参数日期时间不起作用