Приведение строки к типу decimal
От: Аноним  
Дата: 16.09.10 09:49
Оценка:
Есть значение "0.00000" как привести к decimal. ПРобовал Parse но выдаёт ошибку потому что разделитель точка. Хочется стандартный метод вызывать. Не подскажете?
Re: Приведение строки к типу decimal
От: QrystaL Украина  
Дата: 16.09.10 09:54
Оценка:
using System.Globalization;
...
string x = "0.00000";
decimal y = decimal.Parse(x, CultureInfo.InvariantCulture);
Re[2]: Приведение строки к типу decimal
От: Nikolay_P_I  
Дата: 16.09.10 10:01
Оценка:
Здравствуйте, QrystaL, Вы писали:

QL>
QL>using System.Globalization;
QL>...
QL>string x = "0.00000";
QL>decimal y = decimal.Parse(x, CultureInfo.InvariantCulture);
QL>


И теперь ругнется на запятую...
Нет стандартного — свой писать с Invariant и Current Culture (или даже сложнее). Что сработает.
Править или нет — в зависимости от задачи.
Re[3]: Приведение строки к типу decimal
От: QrystaL Украина  
Дата: 16.09.10 10:52
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>И теперь ругнется на запятую...

Где ругнется?
Re[4]: Приведение строки к типу decimal
От: Nikolay_P_I  
Дата: 16.09.10 11:10
Оценка:
Здравствуйте, QrystaL, Вы писали:

QL>Здравствуйте, Nikolay_P_I, Вы писали:

N_P>>И теперь ругнется на запятую...

QL>Где ругнется?


В "34,55". А еще бывает "33.555,03"

Впрочем, может я и ошибаюсь.
Re[5]: Приведение строки к типу decimal
От: QrystaL Украина  
Дата: 16.09.10 11:20
Оценка: +5
N_P>Впрочем, может я и ошибаюсь.
Ну если разделитель в строке точно не известен, то задача в общем виде не решается.
Re: Приведение строки к типу decimal
От: ZAMUNDA Земля для жалоб и предложений
Дата: 16.09.10 12:52
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Есть значение "0.00000" как привести к decimal. ПРобовал Parse но выдаёт ошибку потому что разделитель точка. Хочется стандартный метод вызывать. Не подскажете?

Вот
    Function DecimalParceMotherFucker(ByVal strText_I As String) As Decimal
        Dim strText As String = strText_I.Replace(" ", "") ' Пробелы за людей не считаю!
        Dim strARR() As String = (New Text.RegularExpressions.Regex("[^\d]")).Split(strText)

        strARR(strARR.Length - 1) = "." & strARR(strARR.Length - 1)

        Return Decimal.Parse(String.Join("", strARR), Globalization.CultureInfo.InvariantCulture)
    End Function

покатит?
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[2]: Приведение строки к типу decimal
От: ZAMUNDA Земля для жалоб и предложений
Дата: 16.09.10 12:55
Оценка:
Здравствуйте, ZAMUNDA, Вы писали:

Ну и штоп школота не гафкала, improved version таскаать:
    Function DecimalParceMotherFucker(ByVal strText_I As String) As Decimal
        Dim strText As String = strText_I.Replace(" ", "") ' Пробелы за людей не считаю!
        Dim strARR() As String = (New Text.RegularExpressions.Regex("[^\d]+")).Split(strText)

        strARR(strARR.Length - 1) = "." & strARR(strARR.Length - 1)

        Return Decimal.Parse(String.Join("", strARR), Globalization.CultureInfo.InvariantCulture)
    End Function
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[6]: Приведение строки к типу decimal
От: Nikolay_P_I  
Дата: 16.09.10 13:48
Оценка:
N_P>>Впрочем, может я и ошибаюсь.
QL>Ну если разделитель в строке точно не известен, то задача в общем виде не решается.

Почему ? Решается, всего-то вариантов:

1) Без знаков — автоматом
2) . или , между разрядами
3) . или , между тысячами
4,5) Комбинации 2 и 3

На "-" в начале или конце числа заглядываться не будем.

Даже в общем случае — максимум 4 культуры подобрать, причем автоматически — просто перебором культур найти соответствующие. Однако, в реальности — культур не так много на которые надо закладываться.

Или тупо при 2х знаках считать левый знак — междутысячным, правый — десятичным и заменить их как символы в строке на что надо.

Вот есть у автора "345.567" числа вместо положенных "345.567,00" — тогда ой...

Просто это именна та фигня, что достает страшно тем, что не реализована "из коробки".
Re[3]: Приведение строки к типу decimal
От: Pavel Dvorkin Россия  
Дата: 16.09.10 16:15
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>И теперь ругнется на запятую...

N_P>Нет стандартного — свой писать с Invariant и Current Culture (или даже сложнее). Что сработает.

А не проще попробовать просто так, как есть, а если не получится — заменить точку на запятую (или запятую на точку, в зависимости от того, что в строке есть) и попробовать еще раз ? Какой-нибудь вариант да сработает — третьего вроде не дано.
With best regards
Pavel Dvorkin
Re[7]: Приведение строки к типу decimal
От: _FRED_ Черногория
Дата: 16.09.10 16:29
Оценка: 32 (2) +2 :))
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>>>Впрочем, может я и ошибаюсь.

QL>>Ну если разделитель в строке точно не известен, то задача в общем виде не решается.
N_P>Почему ? Решается, всего-то вариантов:
N_P>1) Без знаков — автоматом
N_P>2) . или , между разрядами
N_P>3) . или , между тысячами
N_P>4,5) Комбинации 2 и 3

Любой уважающий себя тестеровщик обязан иметь установленной на компьютере культуру, в которой десятичный разделитель:
^&

а разделитель тысячных разрядов:
~*

а показатель отрицательности ничем не хуже
@


И только тогда есть возможность обучить кодеров хоть что-то, хоть числа, более-менее парсить.
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Приведение строки к типу decimal
От: ZAMUNDA Земля для жалоб и предложений
Дата: 16.09.10 17:26
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>Любой уважающий себя тестеровщик обязан иметь установленной на компьютере культуру, в которой десятичный разделитель:

Или любой уважаемый тестерами кодер. :-)

PS: Кстати, таким методом был найден глюк в VB6 runtime: она только первую букву из системного разделителя разрядов берёт.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[8]: Приведение строки к типу decimal
От: Uzzy Россия  
Дата: 17.09.10 03:59
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Nikolay_P_I, Вы писали:


N_P>>>>Впрочем, может я и ошибаюсь.

QL>>>Ну если разделитель в строке точно не известен, то задача в общем виде не решается.
N_P>>Почему ? Решается, всего-то вариантов:
N_P>>1) Без знаков — автоматом
N_P>>2) . или , между разрядами
N_P>>3) . или , между тысячами
N_P>>4,5) Комбинации 2 и 3

_FR>Любой уважающий себя тестеровщик обязан иметь установленной на компьютере культуру, в которой десятичный разделитель:

_FR>
^&

_FR>а разделитель тысячных разрядов:
_FR>
~*

_FR>а показатель отрицательности ничем не хуже
_FR>
@


_FR>И только тогда есть возможность обучить кодеров хоть что-то, хоть числа, более-менее парсить.

Но даже это освобождает от необходимости вместе со decimal-строкой передавать культуру, в которой эта строка представлена (а точнее настройки культуры).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.