Sunday, February 8, 2009

HtmlDocument Introspection in Treeview article

J'ai publié aujourd'hui un nouvel article sur codeproject qui s'appelle
HtmlDocument introspection in TreeView.

Article traitant du composant webbrowser et de sa propriété Document.
Ainsi on connait facilement l'ensemble des tag, des elements de formulaire, les liens, les images et aussi les css referant a la page web.

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

Tuesday, February 3, 2009

Process usage en C# avec redirection.

Les unixiens connaissent bien le concept de redirection de la sortie resultant d'un processus.
Ceci est lié à des processus en mode console.
Un processus en mode console a une entrée standart , une sortie standart et une sortie erreur standart ( suivé le lien pour plus d'explication ).

Ainsi les processus Windows peuvent caché aussi ce concept , mais cependant dans l'api DotNet, on retrouve ce concept.

Voici le code, ici pour csstidy :

Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "csstidy.exe";
process.StartInfo.Arguments = cssFilemane + " outputtidy.css";
process.Start();

result = process.StandardOutput.ReadToEnd();
error = process.StandardError.ReadToEnd();


Vous aurez ainsi dans result le texte de sortie du processus.
Si l'on veux scruter ce qu'il se passe dans le processus et par exemple ce dernier montre
son avancement avec la sortie de # par exemple.
On lira la sortie du processus :

while
((str = process.StandardOutput.ReadLine()) != null)
{
}
Regardez cette article pour plus de détail
http://www.codeproject.com/KB/threads/launchprocess.aspx