#c# #decimal
#c# #десятичное число
Вопрос:
У меня есть веб-сервис с методом, который принимает параметр типа decimal. Этот параметр должен иметь 2 разряда с плавающей запятой.
Как я могу это гарантировать?
public void callMyWS(decimal d1) {
...
decimal d2 = Ensure2FloatingPointPlaces(d1);
proxy.MyWSmethod(d2);
}
.
MyWSmethod(decimal myDD) { ... }
MyWSmethod имеет проверку для двух мест. Итак:
Если «d1» равно 1.00 => все в порядке.
Если «d1» равно 1 => проверка завершается с ошибкой.
Основная проблема заключается в том, что d1 является целочисленным.
Я кое-что читал о «m»-суффиксе. Но все примеры с постоянными числами, что не очень полезно… Как вы также можете видеть, преобразование в строку не является целью.
Давайте посмотрим на xsd:
<xs:element name="MyWSmethod" type="tns:MyWSmethodType"/>
...
<xs:complexType name="MyWSmethodType">
<xs:sequence>
...
<xs:element name="myDecimal" type="myDecimalType"/>
...
</xs:sequence>
</xs:complexType>
...
<xs:simpleType name="myDecimalType">
<xs:restriction base="xs:decimal">
<xs:pattern value="[-]?[0-9] .[0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
Поэтому, когда вы создаете клиент веб-сервиса из xsd, у вас будет ограничение на 2 места с плавающей запятой.
Комментарии:
1. Что вы подразумеваете под «Этот параметр должен иметь 2 места с плавающей запятой»? С чем именно вам это поможет?
2. Десятичное число имеет определенный набор чисел, вы не можете заставить его быть короче или длиннее… единственное, что вы можете сделать, это отобразить определенное количество чисел после плавающей запятой.
Ответ №1:
Вы можете использовать математику.Округлите, чтобы усечь до двух знаков после запятой, но вам все равно придется обновить свою проверку.
Убедитесь, что проверка прошла для этих значений:
- 1
- 1.11
- 1.1
- .1
- .11
Комментарии:
1. Первый и главный момент: у меня нет доступа к проверке. И если: определен xsd, который дает для него базу. Я не могу это изменить. У меня больше всего проблем со значениями, которые не имеют части с плавающей запятой (например, 1).