Ho finito per dover scrivere il codice per verificare manualmente la valuta. Personalmente, per un framework che si vanta di avere tutte le cose della globalizzazione integrate, è sorprendente che .NET non abbia nulla a che fare con questo.
La mia soluzione è qui sotto. Funziona per tutti i locali nel framework. Non supporta i numeri negativi, come tuttavia indicato da Orion in seguito. Che cosa ne pensate?
public static bool TryParseCurrency(string value, out decimal result)
{
result = 0;
const int maxCount = 100;
if (String.IsNullOrEmpty(value))
return false;
const string decimalNumberPattern = @"^\-?[0-9]{{1,{4}}}(\{0}[0-9]{{{2}}})*(\{0}[0-9]{{{3}}})*(\{1}[0-9]+)*$";
NumberFormatInfo format = CultureInfo.CurrentCulture.NumberFormat;
int secondaryGroupSize = format.CurrencyGroupSizes.Length > 1
? format.CurrencyGroupSizes[1]
: format.CurrencyGroupSizes[0];
var r = new Regex(String.Format(decimalNumberPattern
, format.CurrencyGroupSeparator==" " ? "s" : format.CurrencyGroupSeparator
, format.CurrencyDecimalSeparator
, secondaryGroupSize
, format.CurrencyGroupSizes[0]
, maxCount), RegexOptions.Compiled | RegexOptions.CultureInvariant);
return !r.IsMatch(value.Trim()) ? false : Decimal.TryParse(value, NumberStyles.Any, CultureInfo.CurrentCulture, out result);
}
Ed ecco un test per dimostrare che funziona (NUnit):
[Test]
public void TestCurrencyStrictParsingInAllLocales()
{
var originalCulture = CultureInfo.CurrentCulture;
var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
const decimal originalNumber = 12345678.98m;
foreach(var culture in cultures)
{
var stringValue = originalNumber.ToCurrencyWithoutSymbolFormat();
decimal resultNumber = 0;
Assert.IsTrue(DecimalUtils.TryParseCurrency(stringValue, out resultNumber));
Assert.AreEqual(originalNumber, resultNumber);
}
System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture;
}
fonte
2009-05-08 02:38:05
Stai cercando di non consentire il separatore di migliaia o solo quelli estranei? –
Avrei dovuto essere più specifico (sono nuovo qui, mi dispiace!). Non riesco a separare migliaia di separatori nella stringa. "1.234.00" dovrebbe essere valido, mentre "12,34.00" dovrebbe essere errato. –