Wednesday, February 4, 2009

Parsing de float avec localisation US, la maudite virgule francaise.

Un post pour partager un soucis que j'ai souvent rencontré, c'est de parser un float anglais, alors que je suis francais.
Effectivement en france, un nombre décimal s'écris avec une virgule exemple : 92,65
alors que les anglais et les américains l'écrivent 92.65
De nombreux logiciels ne prennent pas en compte ce détail culturel. Un détail peut être , mais en informatique souvent un bug possible.

je voulais extraire les nombres des chaines :
"Selector 21 | Property 61
Input size: 1.609KiB Output size: 1.26KiB Compression ratio: 21.72%"

Pas de soucis ,j'utilise le FrameWork dotnet avec les expressions régulieres, sachant que le format est toujours le même, pour ce faire, mais lorsque je veux convertir
1.609 en float j'ai une exception soulevé car windows veux 1,609 pour que la conversion soit effective.

Il faut utiliser :

using System.Globalization

Donc j'ai du faire de la sorte :

Regex regex = new Regex("([0-9]+)");
MatchCollection m = regex.Matches(lstStr[1]);
if (m.Count >= 2)
{
// Selector 21 | Property 61
selector = Int32.Parse(m[0].Groups[0].Value);
property = Int32.Parse(m[1].Groups[0].Value);
}

regex = new Regex("([0-9]+).([0-9]+)");
//"Input size: 1.609KiB Output size: 1.26KiB Compression ratio: 21.72%\r"
m = regex.Matches(lstStr[2]);
if (m.Count >= 3)
{
// Gets a NumberFormatInfo associated with the en-US culture.
NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

inputSize = float.Parse(m[0].Groups[0].Value,nfi);
outputSize = float.Parse(m[1].Groups[0].Value, nfi);
radio = float.Parse(m[2].Groups[0].Value, nfi);
}


Voila j'ai utilisé
// Gets a NumberFormatInfo associated with the en-US culture.
NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

pour forcer le Framework a parser les floats au format US.

Reference MSDN

1 comment:

François said...

merci pour le coup de pouce. Ce post m'a aidé à résoudre un problème sur lequel je galérait depuis quelques heures