我正在尝试确定给定文化的货币符号是否应出现在值的开头或结尾。我无法在.Net CultureInfo中找到这些信息,所以我想我会尝试黑客攻击:
var cultures = new[] {"en-US", "ar-SA", "as-IN", "tr-TR"};
foreach ( var culture in cultures ) {
var cultureInfo = CultureInfo.CreateSpecificCulture( culture );
var currencyValue = 1.234.ToString( "C", cultureInfo );
var rtl = cultureInfo.TextInfo.IsRightToLeft;
var symbolAtBeginning = currencyValue.StartsWith( cultureInfo.NumberFormat.CurrencySymbol, false, cultureInfo );
}
唉,这个方法有时候起作用;在上面的例子中,它适用于“en-US”,但不适用于其他文化。起初我以为是因为有些文化从右到左阅读文本,而“开始”将是正确的,但这种解释并没有证明。
有没有人看到我的代码中存在缺陷,或者最好有更好的方法来确定货币符号位置?
答案 0 :(得分:10)
您可以使用NumberFormatInfo类来确定该信息。您可以读取CurrencyPositive属性的正值,它将返回int
重复该位置。来自MSDN:
0 $n
1 n$
2 $ n
3 n $
答案 1 :(得分:5)
您可以使用文化的NumberFormat
属性的CurrencyPositivePattern
来获取信息。主要的缺陷是文化是以从右到左(RTL)的顺序编写的。然后你必须扭转逻辑。
我已经创建了这个扩展方法。
public static class CultureInfoExtensions
{
public static bool StartsWithCurrencySymbol(this CultureInfo culture)
{
bool startsWithCurrencySymbol =
culture.NumberFormat.CurrencyPositivePattern == 0 ||
culture.NumberFormat.CurrencyPositivePattern == 2;
return culture.TextInfo.IsRightToLeft ? !startsWithCurrencySymbol : startsWithCurrencySymbol;
}
}
您可以这样使用它:
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures)
.Where(c => !c.IsNeutralCulture);
foreach (var ci in cultures)
{
var currencyValue = 1.234.ToString("C", ci);
if (ci.StartsWithCurrencySymbol())
Console.WriteLine("Culture: {0} RTLF? {1} Format: {2}",
ci, ci.TextInfo.IsRightToLeft, currencyValue);
}
Value Associated pattern
0 $n
1 n$
2 $ n
3 n $
答案 2 :(得分:0)
唉,这个方法有时候起作用;在上面的例子中,它适用于“en-US”,但不适用于其他文化。
为什么这么说?据我所知,它适用于所有文化。添加一些跟踪,我得到以下内容,这正是我所期望的:symbolAtBeginning为真IFF货币符号位于LTR文化的左侧,右侧是RTL文化。
culture:en-US currencyValue:$1.23 rtl:False symbolAtBeginning:True
culture:ar-SA currencyValue:ر.س. 1.23 rtl:True symbolAtBeginning:True
culture:as-IN currencyValue:₹ 1.23 rtl:False symbolAtBeginning:True
culture:tr-TR currencyValue:1,23 ₺ rtl:False symbolAtBeginning:False