Voilà :
public class NumberSuffixParser
{
private static readonly Regex rxPattern = new Regex( @"^(?<number>\d+(\.\d+)?)(?<suffix>\p{L}+)$" , RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture ) ;
public void Parse( string value , out decimal number , out string suffix )
{
if ( value == null ) throw new ArgumentNullException("value") ;
Match match = rxPattern.Match( value ) ;
if ( ! match.Success ) throw new ArgumentOutOfRangeException("value") ;
number = decimal.Parse( match.Groups["number"].Value ) ;
suffix = match.Groups["suffix"].Value ;
return ;
}
public decimal ParseNumber( string value )
{
decimal number ;
string suffix ;
Parse( value , out number , out suffix ) ;
return number ;
}
public string ParseSuffix( string value )
{
decimal number ;
string suffix ;
Parse( value , out number , out suffix ) ;
return suffix ;
}
}
Une autre approche, un peu plus simpliste, mais assez souple, suit. Elle analysera volontiers des éléments comme '789xyz', '1234' ou 'abcde'. Si elle ne trouve pas de préfixe entier, elle renvoie 0. Le suffixe est ce qui suit le préfixe entier : si elle ne trouve pas de suffixe, elle renvoie nil ('').
public static void Parse( string value , out int number , out string suffix )
{
number = 0 ;
int i = 0 ;
for ( i = 0 ; i < value.Length && char.IsDigit( value[i] ) ; ++i )
{
number *= 10 ;
number += ( value[i] - '0' ) ;
}
suffix = value.Substring(i) ;
return ;
}