2015-06-12 2 views
1

Борьба с основами - я пытаюсь закодировать простой конвертер валют. XML обеспечивается внешним источником использует запятую в качестве десятичного разделителя для обменного курса (kurs_sredni):String to Double Conversion (Comma to dot issue)

<pozycja> 
    <nazwa_waluty>bat (Tajlandia)</nazwa_waluty> 
    <przelicznik>1</przelicznik> 
    <kod_waluty>THB</kod_waluty> 
    <kurs_sredni>0,1099</kurs_sredni> 
</pozycja> 

я уже успел загрузить данные из XML в щегольской список объектов (kursyAktualne), и теперь я пытаясь сделать математику. Я застрял в конверсии.

Прежде всего, я назначаю «kurs_sredni» строке, пытаясь заменить «,» на «.». и преобразование ад из него:

string kursS = kursyAktualne[iNa].kurs_sredni; 
kursS.Replace(",","."); 
kurs = Convert.ToDouble(kursS); 
MessageBox.Show(kurs.ToString()); 

В MessageBox шоу 1099 вместо ожидаемого 0.1099 и KURSS еще есть запятая, а не точка.

Пробовал играть с некоторыми материалами CultureInfo, которые я искал в googled, но это было слишком случайно. Мне нужно понять, как контролировать это.

+2

Строки в C# неизменны. Вы имели в виду 'kursS = kursS.Replace (", ",". ");' – AlexD

ответ

1

Это потому, что метод Replace возвращает новую строку с замененными символами. Он не изменяет исходную строку.

Таким образом, вы должны передать его:

kursS = kursS.Replace(",","."); 
2

Просто используйте decimal.Parse но указать CultureInfo. В этом нет ничего «случайного» - выберите подходящий CultureInfo, а затем используйте его. Например:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     var french = CultureInfo.GetCultureInfo("fr-FR"); 
     decimal value = decimal.Parse("0,1099", french); 
     Console.WriteLine(value.ToString(CultureInfo.InvariantCulture)); // 0.1099 
    } 
} 

Это просто использует французский язык как один пример культуры, которая использует , в качестве десятичного разделителя. Вероятно, имеет смысл использовать культуру происхождения данных.

Отметьте, что decimal является лучшим выбором для значений валюты, чем double - вы пытаетесь представить «искусственную» конструкцию, которая естественно указана в base10, а не «естественная» непрерывная величина, такая как вес.

(Я также опасаюсь поставщика данных, который предоставляет данные в нестандартном формате. Если они ошибаются, кто знает, что еще они будут делать неправильно. Это не похоже на то, что XML не имеют хорошо определенный формат для чисел ...)

+0

Почему французский?Похоже больше на чешский :) – abatishchev

+0

@abatishchev: Как я уже сказал в ответе, я просто использовал французский как пример одной культуры, используя запятую в качестве десятичного разделителя. –

+0

Я знаю, я прочитал ваш ответ. Просто шучу. ОК. возможно, это было глупо. – abatishchev

0

Replace возвращает строку. Поэтому вам нужно задание.

kursS = kursS.Replace(",", "."); 

Существует «опрятный» способ сделать это, используя CulturInfo. Посмотрите это на веб-сайте MSDN.

0

Вы заменяете результат не используется, но исходное значение, которое не содержит замену. Вы должны сделать:

kursS = kursS.Replace(",", ".") 

Кроме того, этот метод не очень безопасно, если есть тысячи-сепараторы. Так что, если вы не используете настройки культуры, вы должны сделать:

kursS = kursS.Replace(".", "").Replace(",", ".")