【问题标题】:Format currency for different countries为不同国家格式化货币
【发布时间】:2018-08-20 21:57:14
【问题描述】:

我正在使用 Xamarin 表单,并尝试将字符串(在 XAML 视图中)格式化为以下形式的货币:1.235.436,00,其中逗号 , 是小数点分隔符。起初,我使用StringFormat{0:C2},结果是:$1,235,436.00,这是美国的。之后,我尝试了StringFormat{0:#,0.#0},结果:1,235,436.00

最后,我尝试通过交换点和逗号{0:#.0,#0}来使用相同的逻辑,结果是:1235436.000

那么我如何格式化法国、西班牙、瑞典等国的货币? 哪个是0.000.000,00 €/kr

XAML 代码:

Label Text="{Binding value, StringFormat='{0:C2}.'}"

在我的情况下这是不正确的。

【问题讨论】:

    标签: c# .net xaml xamarin.forms


    【解决方案1】:

    您不能直接在使用StringFormat 的绑定中执行此操作。您可以实现自定义IValueConverter 或创建string 属性,然后在代码中实现格式化:

    1235436.ToString("C2", CultureInfo.CreateSpecificCulture("es-ES"));
    

    这会将数字格式化为具有特定西班牙文化显示设置的货币。

    您还可以修改默认区域性格式以强制使用特定格式:

    var culture = CultureInfo.CreateSpecificCulture("en-US");
    culture.NumberFormat.CurrencyDecimalSeparator = ",";
    culture.NumberFormat.CurrencyGroupSeparator = ".";
    

    但您不需要这样做。文化默认值以用户期望显示内容的方式设置。更改默认格式可能会引起误解。

    【讨论】:

    • 添加自定义属性在生成带有链接的 apk 时不起作用。我很困惑
    【解决方案2】:

    您使用的格式{0:C2} 是正确的。要根据地区更改格式,您需要更改线程上的文化。看起来您已将其设置为默认的en-US,就像您说的那样。你可以这样检查:

      CultureInfo current = CultureInfo.CurrentCulture;
      Console.WriteLine("The current culture is {0}", current.Name);
    

    将其更改为法国:

      CultureInfo.CurrentCulture = new CultureInfo("fr-FR");
    

    现在您的值将自动格式化为1.235.436,00

    【讨论】:

    • 感谢您的建议,但在 Xamarin 表单中我无法使用表达式:CultureInfo.CurrentCulture = new CultureInfo("fr-FR");
    • 这不是表达式,您需要将其添加到您的 C# 代码中。当你启动你的应用程序时,你需要检测用户手机的语言和地区,然后使用我的回答中的行来相应地设置线程文化。
    • 感谢 Racil HilanMartin Zikmund 的建议 :) 以下是 Xamarin Forms 中的答案:CultureInfo myCurrency = new CultureInfo("fr-FR"); CultureInfo.DefaultThreadCurrentCulture = myCurrency;
    • 是的,这与我的建议类似,只是使用DefaultThreadCurrentCulture 而不是CurrentCulture。运行这行代码后,所有格式(例如货币、日期等)都将使用指定的文化来完成。
    【解决方案3】:

    在 xaml.cs 中添加一行代码这将转换文化

    CultureInfo myCurrency = new CultureInfo("en-US");
    CultureInfo.DefaultThreadCurrentCulture = myCurrency;
    

    在xml中

    <Label Text="{Binding value, StringFormat='{0:#,0.#0}'}"
    

    结果:5,245.00

    我通过列表获得这些信息

    【讨论】:

      【解决方案4】:

      你想办法:

      // Get Present Culture in app.
      
      var ci = new CultureInfo(App.DeviceCulture);
      

      // 转换为格式字符串。

      stringValue = ConvertCultureCurrencyToString(stringValue, ci);
      

      // 创建方法转换为格式

      public static string ConvertCultureCurrencyToString(string stringValue, CultureInfo ci)
          {
              try
              {
                  if (string.IsNullOrEmpty(stringValue))
                      return "0";
      
                  stringValue = System.Convert.ToString(stringValue, ci);
                  // currency -> double (format to double)
                  var currency = decimal.Parse(stringValue, NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, ci);
      
                  stringValue = currency.ToString("#,###.###", ci);
      
                  if (stringValue.FirstOrDefault() == '.' || stringValue.FirstOrDefault() == ',')   
                      stringValue = $"0{stringValue}";
      
                  return stringValue;
              }
              catch
              {
                  return "0";
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2023-04-04
        相关资源
        最近更新 更多