На самом деле, у меня есть несколько систем, которые могут генерировать числовые данные, и они хранятся на каком-либо веб-сервере в текстовых файлах. Некоторые из систем используют десятичную точку в качестве разделителя фракций, некоторые из систем используют десятичную запятую как таковые.Межрегиональный десятичный/двойной синтаксический анализ
Приложения (жирный клиент, .net 2.0) также могут быть запущены на любых системах.
Таким образом, после некоторого спотыкаясь я сделал это: (http://pastebin.com/vhLXABDD)
public static bool HasDecimalComma;
public static bool HasDecimalPeriod;
public static double GetNumber(string NumberString)
{
if (!HasDecimalComma && !HasDecimalPeriod)
{
string s = string.Format("{0:0.0}", 123.123);
if (s.Contains('.'))
{
HasDecimalPeriod = true;
}
else if (s.Contains(','))
{
HasDecimalComma = true;
}
else
{
throw new SystemException(string.Format("strange number format '{0}'", s));
}
}
if (HasDecimalComma)
{
return double.Parse(NumberString.Replace('.', ','));
}
if (HasDecimalPeriod)
{
return double.Parse(NumberString.Replace(',', '.'));
}
throw new ArgumentException(string.Format("can't parse '{0}'", NumberString));
}
вы могли бы предложить какие-либо лучше, более элегантный способ?
EDIT:
Я извиняюсь за не упоминать это раньше, и так как ваши ответы постных в этом направлении - я не могу хранить культуру формирования с номерами, я могу попробовать только «обнаружить» это.
Использование 'CultureInfo'? – Leri
Можете ли вы сохранить генерирующую культуру с числовой строкой? Это облегчит любую потребность в таком изгибе. – SWeko
Знаете ли вы, что будет сгенерировать номера? например, до набора опций? Я не уверен, как ваша система будет разбираться с разбором «1,000.12» (на самом деле я знаю, это сломается). Если у вас ограниченное количество возможных форматов, вы можете просто попробовать каждый из них, если у них нет возможности двусмысленности. – Chris