Как decimal перевести в string c
Все примитивные типы имеют два метода, которые позволяют преобразовать строку к данному типу. Это методы Parse() и TryParse() .
Метод Parse() в качестве параметра принимает строку и возвращает объект текущего типа. Например:
int a = int.Parse("10"); double b = double.Parse("23,56"); decimal c = decimal.Parse("12,45"); byte d = byte.Parse("4"); Console.WriteLine($"a= b= c= d=");
Стоит отметить, что парсинг дробных чисел зависит от настроек текущей культуры. В частности, для получения числа double я передаю строку «23,56» с запятой в качестве разделителя. Если бы я передал точку вместо запятой, то приложение выдало ошибку выполнения. На компьютерах с другой локалью, наоборот, использование запятой вместо точки выдало бы ошибку.
Чтобы не зависеть от культурных различий мы можем установить четкий формат с помощью класса NumberFormatInfo и его свойства NumberDecimalSeparator :
using System.Globalization; IFormatProvider formatter = new NumberFormatInfo < NumberDecimalSeparator = "." >; double number = double.Parse("23.56", formatter); Console.WriteLine(number); // 23,56
В данном случае в качестве разделителя устанавливается точка. Однако тем не менее потенциально при использовании метода Parse мы можем столкнуться с ошибкой, например, при передачи алфавитных символов вместо числовых. И в этом случае более удачным выбором будет применение метода TryParse() . Он пытается преобразовать строку к типу и, если преобразование прошло успешно, то возвращает true . Иначе возвращается false:
Console.WriteLine("Введите строку:"); string? input = Console.ReadLine(); bool result = int.TryParse(input, out var number); if (result == true) Console.WriteLine($"Преобразование прошло успешно. Число: "); else Console.WriteLine("Преобразование завершилось неудачно");
Если преобразование пройдет неудачно, то исключения никакого не будет выброшено, просто метод TryParse возвратит false, а переменная number будет содержать значение по умолчанию.
Convert
Класс Convert представляет еще один способ для преобразования значений. Для этого в нем определены следующие статические методы:
- ToBoolean(value)
- ToByte(value)
- ToChar(value)
- ToDateTime(value)
- ToDecimal(value)
- ToDouble(value)
- ToInt16(value)
- ToInt32(value)
- ToInt64(value)
- ToSByte(value)
- ToSingle(value)
- ToUInt16(value)
- ToUInt32(value)
- ToUInt64(value)
В качестве параметра в эти методы может передаваться значение различных примитивных типов, необязательно строки:
int n = Convert.ToInt32("23"); bool b = true; double d = Convert.ToDouble(b); Console.WriteLine($"n= d=");
Однако опять же, как и в случае с методом Parse, если методу не удастся преобразовать значение к нужному типу, то он выбрасывает исключение FormatException.
Как decimal перевести в string c
При рассмотрении типов данных указывалось, какие значения может иметь тот или иной тип и сколько байт памяти он может занимать. В прошлой теме были расмотрены арифметические операции. Теперь применим операцию сложения к данным разных типов:
byte a = 4; int b = a + 70;
Результатом операции вполне справедливо является число 74, как и ожидается.
Но теперь попробуем применить сложение к двум объектам типа byte :
byte a = 4; byte b = a + 70; // ошибка
Здесь поменялся только тип переменной, которая получает результат сложения — с int на byte. Однако при попытке скомпилировать программу мы получим ошибку на этапе компиляции. И если мы работаем в Visual Studio, среда подчеркнет вторую строку красной волнистой линией, указывая, что в ней ошибка.
При операциях мы должны учитывать диапазон значений, которые может хранить тот или иной тип. Но в данном случае число 74, которое мы ожидаем получить, вполне укладывается в диапазон значений типа byte, тем не менее мы получаем ошибку.
Дело в том, что операция сложения (да и вычитания) возвращает значение типа int, если в операции участвуют целочисленные типы данных с разрядностью меньше или равно int (то есть типы byte, short, int). Поэтому результатом операции a + 70 будет объект, который имеет длину в памяти 4 байта. Затем этот объект мы пытаемся присвоить переменной b, которая имеет тип byte и в памяти занимает 1 байт.
И чтобы выйти из этой ситуации, необходимо применить операцию преобразования типов. Операция преобразования типов предполагает указание в скобках того типа, к которому надо преобразовать значение:
(тип_данных_в_который_надо_преобразовать)значение_для_преобразования;
Так, изменим предыдущий пример, применив операцию преобразования типов:
byte a = 4; byte b = (byte)(a + 70);
Сужающие и расширяющие преобразования
Преобразования могут быть сужающие (narrowing) и расширяющие (widening). Расширяющие преобразования расширяют размер объекта в памяти. Например:
byte a = 4; // 0000100 ushort b = a; // 000000000000100
В данном случае переменной типа ushort присваивается значение типа byte. Тип byte занимает 1 байт (8 бит), и значение переменной a в двоичном виде можно представить как:
00000100
Значение типа ushort занимает 2 байта (16 бит). И при присвоении переменной b значение переменной a расширяется до 2 байт
0000000000000100
То есть значение, которое занимает 8 бит, расширяется до 16 бит.
Сужающие преобразования, наоборот, сужают значение до типа меньшей разядности. Во втором листинге статьи мы как раз имели дело с сужающими преобразованиями:
ushort a = 4; byte b = (byte) a;
Здесь переменной b, которая занимает 8 бит, присваивается значение ushort, которое занимает 16 бит. То есть из 0000000000000100 получаем 00000100 . Таким образом, значение сужается с 16 бит (2 байт) до 8 бит (1 байт).
Явные и неявные преобразования
Неявные преобразования
В случае с расширяющими преобразованиями компилятор за нас выполнял все преобразования данных, то есть преобразования были неявными ( implicit conversion ). Такие преобразования не вызывают каких-то затруднений. Тем не менее стоит сказать пару слов об общей механике подобных преобразований.
Если производится преобразование от безнакового типа меньшей разрядности к безнаковому типу большой разрядности, то добавляются дополнительные биты, которые имеют значени 0. Это называется дополнение нулями или zero extension.
byte a = 4; // 0000100 ushort b = a; // 000000000000100
Если производится преобразование к знаковому типу, то битовое представление дополняется нулями, если число положительное, и единицами, если число отрицательное. Последний разряд числа содержит знаковый бит — 0 для положительных и 1 для отрицательных чисел. При расширении в добавленные разряды компируется знаковый бит.
Рассмотрим преобразование положительного числа:
sbyte a = 4; // 0000100 short b = a; // 000000000000100

Преобразование отрицательного числа:
sbyte a = -4; // 1111100 short b = a; // 111111111111100

Явные преобразования
При явных преобразованиях ( explicit conversion ) мы сами должны применить операцию преобразования (операция () ). Суть операции преобразования типов состоит в том, что перед значением указывается в скобках тип, к которому надо привести данное значение:
int a = 4; int b = 6; byte c = (byte)(a+b);
Расширяющие преобразования от типа с меньшей разрядностью к типу с большей разрядностью компилятор проводит неявно. Это могут быть следующие цепочки преобразований:
byte -> short -> int -> long -> decimal
short -> float -> double
Все безопасные автоматические преобразования можно описать следующей таблицей:
В какие типы безопасно преобразуется
short, ushort, int, uint, long, ulong, float, double, decimal
short, int, long, float, double, decimal
int, long, float, double, decimal
int, uint, long, ulong, float, double, decimal
long, float, double, decimal
long, ulong, float, double, decimal
float, double, decimal
float, double, decimal
ushort, int, uint, long, ulong, float, double, decimal
В остальных случаях следует использовать явные преобразования типов.
Также следует отметить, что несмотря на то, что и double, и decimal могут хранить дробные данные, а decimal имеет большую разрядность, чем double, но все равно значение double нужно явно приводить к типу decimal:
double a = 4.0; decimal b = (decimal)a;
Потеря данных и ключевое слово checked
Рассмотрим другую ситуацию, что будет, например, в следующем случае:
int a = 33; int b = 600; byte c = (byte)(a+b); Console.WriteLine(c); // 121
Результатом будет число 121, так число 633 не попадает в допустимый диапазон для типа byte, и старшие биты будут усекаться. В итоге получится число 121. Поэтому при преобразованиях надо это учитывать. И мы в данном случае можем либо взять такие числа a и b, которые в сумме дадут число не больше 255, либо мы можем выбрать вместо byte другой тип данных, например, int.
Однако ситуации разные могут быть. Мы можем точно не знать, какие значения будут иметь числа a и b. И чтобы избежать подобных ситуаций, в c# имеется ключевое слово checked :
try < int a = 33; int b = 600; byte c = checked((byte)(a + b)); Console.WriteLine(c); >catch (OverflowException ex)
При использовании ключевого слова checked приложение выбрасывает исключение о переполнении. Поэтому для его обработки в данном случае используется конструкция try. catch. Подробнее данную конструкцию и обработку исключений мы рассмотрим позже, а пока надо знать, что в блок try мы включаем действия, в которых может потенциально возникнуть ошибка, а в блоке catch обрабатываем ошибку.
Как правильно перевести string в decimal?
Здравствуйте, господа. Есть свойство barGraph1.Maximum, в которое нужно записать значение типа decimal из label (тип string).
Перепробовал различные варианты, и так и сяк. Все в пустую. Выдает исключение о неверном формате.
Что пробовал, но не заработало:
1 2 3 4 5 6 7 8 9 10 11 12 13
//1 вариант barGraph1.Maximum = Convert.ToDecimal(tpsLabel7.Text); //2 вариант barGraph1.Maximum = decimal.Parse(tpsLabel7.Text); //3 вариант выдает ошибку 'decimal' does not contain a definition for 'TryParse' barGraph1.Maximum = decimal.TryParse(tpsLabel7.Text); //4 вариант (от безысходности) int count1 = Convert.ToInt32(ftpsLabel7.Text); decimal count2 = Convert.ToDecimal(count1); barGraph1.Maximum = count2;
Если записать просто barGraph1.Maximum = 50 или barGraph1.Maximum = 50m, то все работает.
Помогите советом пожалуйста)
Описание к свойству:
Gets or sets the Maximum valid value for this BarGraph.
public decimal Maximum { get; set; }
Преобразование числа в строку
Вот использовать для конвертирования в С++ методы С вроде atoi,sprintf и т.п. может быть чревато последствиями. Вот чисто с++-ный вариант на основе потоков, причём универсальный. Можно конвертировать хоть целочисленные типы, хоть с плавающей точкой.
#include #include template std::string toString(T val) < std::ostringstream oss; osstemplate T fromString(const std::string& s) < std::istringstream iss(s); T res; iss >> res; return res; >
Используется следующим образом
std::string str; int iVal; float fVal; str = toString(iVal); str = tiString(fVal); iVal = fromString(str); fVal = fromString(str);
Отслеживать
ответ дан 9 авг 2011 в 9:10
181 6 6 бронзовых знаков
Только в отличии от форматирования в sprintf() совершенно не ясно, каков будет конечный вид.
9 авг 2011 в 9:21
почему неясно? toString() — конечный вид string. fromString<КонечныйТип>() — конечный тип указывается в угловых скобках <>, в данном случае конечный тип будет «КонечныйТип».КонечныйТип>
9 авг 2011 в 9:48
Вы не поняли. Я имел в виду, какие символы (десятичная точка, знаки плюс/минус и т.п.) и как (размещение в поле вывода) будут выводиться в строку. У форматов sprintf() достаточно богатые возможности, и они видны ‘по месту’. Как нечто подобное реализовать Вашим методом ?
9 авг 2011 в 11:38
Я бы этот код назвал плохим. Мне лично непонятна обработка ошибок. Ну, шаблоны это круто, но положим, что во входной строке у нас нет целого числа, а абракадабра. Что будет? Я эту проблему уже тут на ХэшКод решал. Код получился существенно некрасивый. До некоторой степени printf’ы в использовании проще и нагляднее, чем эта шаблонная магия. P.S. претензия не к toString, а к fromString. С toString все хорошо.
9 авг 2011 в 13:57
#include int x = 10; std::string y = std::to_string(x);
Отслеживать
ответ дан 9 янв 2016 в 14:57
Павел Лукин Павел Лукин
111 1 1 серебряный знак 5 5 бронзовых знаков
#include printf("Number is %f\n", x);
#include std::cout
Отслеживать
ответ дан 4 авг 2011 в 13:07
Nicolas Chabanovsky Nicolas Chabanovsky
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков
это всё так, но в том и дело, что в str надо записать x и отобразить его.
4 авг 2011 в 13:13
Как вариант - воспользоваться sprintf(). Это именно в char *str запишет.
4 авг 2011 в 14:18
Воспользоваться функцией sprintf из stdio.h:
float x = 0.05f; char str[20]; sprintf(str, "%f", x);//или любой другой формат, как это делается в printf() std::cout
Отслеживать
14k 33 33 серебряных знака 46 46 бронзовых знаков
ответ дан 4 авг 2011 в 14:17
2,828 14 14 серебряных знаков 18 18 бронзовых знаков
strstream s; float x = 0.05f; s
upd: ещё можно использовать stringstream
Отслеживать
ответ дан 4 авг 2011 в 13:33
3,456 12 12 серебряных знаков 9 9 бронзовых знаков
В С++20 можно будет использовать функцию std::format , которая возвращает готовую строку.
Пока поддержки компиляторами не реализовано можно ссылаться через fmt:: , например:
#include #include #include int main() < float x = 0.05f; std::string s = fmt::format("<>", x); std::cout
Переменная s совершенно не обязательна и добавлена для наглядности и желания ТС иметь результат именно в строке.
Отслеживать
ответ дан 18 июн 2021 в 6:25
28.5k 12 12 золотых знаков 58 58 серебряных знаков 118 118 бронзовых знаков
Главный плюс такого решения: количество знаков после точки определяется автоматически. Есть еще fmt::to_string(x) , который делает то же самое.
18 июн 2021 в 6:32
#include "stdafx.h" #include #include using namespace std; int _tmain(int argc, _TCHAR* argv[])
Отслеживать
user177221
ответ дан 13 июл 2015 в 8:48
9 1 1 бронзовый знак
string flts (long x) < string s; char c; while(x) < c=(x%10)+'0'; s=c+s; x=x/10; >return s; >
Отслеживать
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
ответ дан 13 окт 2016 в 22:15
Роман Олегович Дегтярев Роман Олегович Дегтярев
Пожалуйста, постарайтесь писать более развернутые ответы. Уверен, автор вопроса был бы благодарен за ваш экспертный комментарий к приведенному выше коду.
14 окт 2016 в 10:32
Я реализовал функцию преобразования числа любого типа в строку таким способом.
value: число которое необходимо преобразовать
radix: система счисления (2/8/10/16)
dec_places: количество знаков после запятой (для вещественного числа)
*если mant_len не указано, то будут преобразованы все знаки, а это не всегда нужно, так как из-за особенностей представления чисел с плавающей запятой результат будет не тот который мы ожидаем.
Например:
ntos(-0.12) вернет: -0.119999999999999996447286321199499070644378662109375
Но если явно указать необходимое количество знаков после запятой, например 2:
ntos(-0.12, 10, 2) вернет: -0.12
/**********************************************************************/ /* Function of converting the number of any type to the string */ /* ================================================================== */ /* value: Number to convert */ /* radix: Numeral system - 2(bin) / 8(oct) / 10(dec) / 16(hex) */ /* dec_places: Number of the places to the right of the decimal point */ /**********************************************************************/ template string ntos(T value, uint8_t radix = 10, int32_t dec_places = -1) < static const char ns[] = "0123456789ABCDEF"; string str = "\0"; switch (radix) < case 2: case 8: case 10: case 16: break; default: return str; >uint8_t mod, index = 0; /* Handler for the signed part of the nuber */ if (value < 0) < /* It is a negative number */ value = abs(value); if (value && dec_places != 0) < index = 1; str.insert(0, "-"); >else < /* Value less than 0 and decimal places value is 0 */ str.insert(0, "0"); return str; >> /* Handler for the unsigned part of the number */ uint64_t integer = uint64_t(value); do < /* Convert an integer part to string */ mod = integer % radix; integer /= radix; str.insert(index, (const char*)&ns[mod], 1); >while (integer); /* Handler for the places to the right of the decimal point of the number */ value -= (uint64_t)value; /* Substract an integer part */ if (value && dec_places != 0) < uint64_t len = 0; if (dec_places >0) < /* Rounding */ uint32_t pow10 = 1; for (uint32_t i = 0; i < dec_places; i++) pow10 *= 10; value *= pow10; value += 0.5f; value /= pow10; >str += '.'; do < value *= 10; integer = (uint64_t)value; value -= integer; mod = integer % radix; integer /= radix; str += (const char)ns[mod]; >while (value && ++len != dec_places); > return str; >