2015-08-03 1 views
1

J'ai une chaîne qui contient une valeur numérique dans une culture (par exemple, la chaîne est "$ 1000.00" et la culture est "en"). Je veux convertir cette chaîne en une chaîne dans l'autre culture tout en préservant autant d'informations sur le format original que possible. Par exemple:Convertir une chaîne contenant une valeur numérique dans la même chaîne avec différents paramètres de culture tout en préservant le format original

"$ 1000.00" dans "en" culture =>"1 000,00 $" dans "ru" culture.

J'ai essayé l'approche la plus évidente:

private static bool TryConvertNumberString(IFormatProvider fromFormat, IFormatProvider toFormat, string number, out string result) 
{ 
    double numericResult; 
    if (!double.TryParse(number, NumberStyles.Any, fromFormat, out numericResult)) 
    { 
     result = null; 
     return false; 
    } 

    result = numericResult.ToString(toFormat); 
    return true; 
} 

Mais cela ne fonctionne pas comme je le veux à: Double.TryParse « mange » toutes les informations sur la présence de signes de change, chiffres décimaux, etc donc, si je tente d'utiliser cette méthode comme ceci:

string result; 
TryConvertNumberString(new CultureInfo("en"), new CultureInfo("ru"), "$ 1000.00", out result); 
Console.WriteLine(result); 

Je vais juste 1000, pas "1 000,00 $".

Y at-il un moyen facile d'obtenir ce comportement en utilisant .NET?

Répondre

2

Double.ToString(IFormatProvider) method utilise the general ("G") format specifier par défaut et que le spécificateur ne renvoie pas la propriété CurrencySymbol de l'objet NumberFormatInfo actuel.

Vous pouvez simplement utiliser The "C" (or currency) format specifier comme premier paramètre dans votre méthode ToString qui est exactement ce que vous cherchez.

result = numericResult.ToString("C", toFormat); 

Here a demonstration.

Par ailleurs, la culture a ru-RU comme CurrencySymbol, si vous voulez $ dans un résultat, vous pouvez Clone cette culture ru-RU, définissez cette propriété CurrencySymbol et utiliser que la culture cloné dans votre partie toFormat.

var clone = (CultureInfo)toFormat.Clone(); 
clone.NumberFormat.CurrencySymbol = "$"; 
result = numericResult.ToString("C", clone);