Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/51: Рейтинг темы: голосов - 51, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 07.01.2009
Сообщений: 2

Флаги форматирования .NET-строк

07.01.2009, 21:24. Показов 10847. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В книге Э. Троелсена "C# и платформа .NET 3.0" есть краткое описание флагов
форматирования .NET-строк:
  • C -- валюта;
  • D -- десятичные числа;
  • E -- экспоненциальный вид;
  • F -- с фиксированной запятой;
  • G -- общий (general);
  • N -- простое числовое форматирование;
  • X -- шестнадцатеричное форматирование.
Однако вывод с флагами А и Т ничем не отличается!

Вопрос №1:
В чем тогда разница между этими флагами форматирования?

Вопрос №2:
Флаг G ведет себя как флаг D с целыми числами, как D или F с
дробными числами и может выводить числа в шестнадцатеричном виде?

P.S.:
В статье MSDN есть более полное описание с примером кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Console.WriteLine("Standard Numeric Format Specifiers:");
Console.WriteLine(
 "(C) Currency: . . . . . . . . {0:C}\n" +
 "(D) Decimal:. . . . . . . . . {0: D}\n" +
 "(E) Scientific: . . . . . . . {1:E}\n" +
 "(F) Fixed point:. . . . . . . {1:F}\n" +
 "(G) General:. . . . . . . . . {0:G}\n" +
 "    (default):. . . . . . . . {0} (default = 'G')\n" +
 "(N) Number: . . . . . . . . . {1:N}\n" +
 "(P) Percent:. . . . . . . . . {1:P}\n" +
 "(R) Round-trip: . . . . . . . {1:R}\n" +
 "(X) Hexadecimal:. . . . . . . {0:X}\n",
 -123, -123.45f);
Можите запустить и убедиться:
Code
1
2
3
4
5
6
7
8
9
10
11
Standard Numeric Format Specifiers:
(C) Currency: . . . . . . . . ($123.00)
(D) Decimal:. . . . . . . . . -123
(E) Scientific: . . . . . . . -1.234500E+002
[B](F) Fixed point:. . . . . . . -123.45[/B]
(G) General:. . . . . . . . . -123
    (default):. . . . . . . . -123 (default = 'G')
[B](N) Number: . . . . . . . . . -123.45[/B]
(P) Percent:. . . . . . . . . -12,345.00 %
(R) Round-trip: . . . . . . . -123.45
(X) Hexadecimal:. . . . . . . FFFFFF85
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2009, 21:24
Ответы с готовыми решениями:

ASP.NET приложение для чтения и форматирования
Привет всем, дорогие. Далее показан код приложения, которое должно читать определенный набор входных данных, их нужно отформатировать. А...

Использование символов для форматирования числовых данных в .Net
Написал для эксперимента код: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace...

Перегрузка форматирования строк
По примеру с датой String str = String.Format("It is now {0:d} at {0:t}", DateTime.Now); хочу сделать такую же перегрузку для...

13
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
12.01.2009, 03:01
флаг N, в отличие от F, разбивает число на порядки (5 123 456,11)
0
0 / 0 / 0
Регистрация: 07.01.2009
Сообщений: 2
15.01.2009, 21:15  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
флаг N, в отличие от F, разбивает число на порядки (5 123 456,11)
И все?!?!
Стоило ради этого дополнительный флаг делать?!?!

А флаг G то же самое, что и D?
0
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
17.04.2010, 18:40
у меня есть острый вопрос по этим флагам. но думаю, не стоило создавать новую тему

у меня иногда результат вычисления меньше, чем 0,0001, и функция, например, ToString() с флагами и без них упорно превращает число 0,00001 в 1E-05, что для меня недопустимо - я пишу распознаватель функций.

таким образом, я хочу, чтобы тип Double преобразовывался в String ТОЛЬКО в формат с плавающей запятой, тоесть запретить приводить в научный(экспоненциальный) формат. и хотелось бы сделать это с помощью флагов, с которыми пока что не получилось разобраться

можно попытаться какнибудь использовать Double.Parse, но у меня так же идет борьба и за скорость.

ну и,конечно, вариант написать свой перевод числа в строку остается всегда, но это крайность)

заранее спасибо!)
0
4 / 4 / 2
Регистрация: 09.02.2009
Сообщений: 87
17.04.2010, 19:24
У меня аналогичная проблема, но нужно для любого числа, например 0.0001 определять кол-во знаков после запятой, если ли какой то простой метод ?
0
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
17.04.2010, 23:37
RaZoR2008, для твоей задачи можно простой метод написать


C#
1
2
3
4
5
6
7
8
double k; // твое число
int Count=0; //счетчик знаков после запятой
while ((k - (int)k) > 0) //пока есть дробная часть у числа k
{
    Count++;
    k=k*10; //сдвигаем разряд числа
}
return Count;
Добавлено через 3 часа 25 минут
только что сделал свой конвертер. вот он:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public string ConvDoubToStr(double doub)
        {
            string str = ((int)doub).ToString();
            double k = (doub - (int)doub);
            if (k > 0)
                str += ",";
            while (k > 0)
            {
                k = k * 10;
                switch ((int)k)
                {
                    case 0:
                        str += "0";
                        break;
                    case 1:
                        str += "1";
                        break;
                    case 2:
                        str += "2";
                        break;
                    case 3:
                        str += "3";
                        break;
                    case 4:
                        str += "4";
                        break;
                    case 5:
                        str += "5";
                        break;
                    case 6:
                        str += "6";
                        break;
                    case 7:
                        str += "7";
                        break;
                    case 8:
                        str += "8";
                        break;
                    case 9:
                        str += "9";
                        break;
                }
                k = k - (int)k;
            }
            return str;
 
        }
инетересно,что операция k = (doub - (int)doub) при doub=123.123 дала: k=0.12300000000000466, при том что сам (int)doub, естественно, равнялся 123 ровно.

а самое убийственное, это то,что конечный результат получился такой:
123,123000000000004661160346586257219314 5751953125

в общем, все дело, видимо в приведении типов. надо чтото с этим думать

Добавлено через 7 минут
я тут сам отвечаю на свои вопросы))))

связано это с тем,что тип дабл "понимает" 15 знаков после запятой, но не больше. поэтому там в конце чушь и получается.

Math.Round(), или чтонибудь быстрее даже можно самому сделать
0
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
18.04.2010, 00:07
Цитата Сообщение от junkier Посмотреть сообщение
т. и хотелось бы сделать это с помощью флагов, с которыми пока что не получилось разобраться
а вот так пробовали?
C#
1
2
  double s = 0.0000001;
  MessageBox.Show(String.Format("{0:F8}",s));
0
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
18.04.2010, 10:54
здорово, оно работает, конечно, но зачем мне удлинять свою строку, когда например у меня s=1, а результат становится 1,00000000.
а преобразований в строку много может быть, строка будет слишком длинной, мне это нежелательно.

да, в моей версии конвертера есть ошибки, там надо дополнить немного

C#
1
2
3
4
if (doub < 0 && doub > -1)
    str = "-";
str += ((int)doub).ToString();
double k = Math.Abs(Math.Round((doub - (int)doub),10));
и в конце блока while:

C#
1
k = Math.Round(k - (int)k,10);
только у меня теперь возник вопрос к более опытным: будет ли мой конвертер работать быстрее,чем тот же ToString() или String.Format()?
0
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
18.04.2010, 13:48
Цитата Сообщение от junkier Посмотреть сообщение
здорово, оно работает, конечно, но зачем мне удлинять свою строку, когда например у меня s=1, а результат становится 1,00000000.
а преобразований в строку много может быть, строка будет слишком длинной, мне это нежелательно.
Если не хотите чтобы добавлялись незначиные нули после запятой то можно написать так
C#
1
2
3
       double s = 1.000000;
       char[] del = { '0', ',', '.' };
       MessageBox.Show(String.Format("{0:F10}",s).TrimEnd( del));
Добавлено через 17 минут
Цитата Сообщение от junkier Посмотреть сообщение
только у меня теперь возник вопрос к более опытным: будет ли мой конвертер работать быстрее,чем тот же ToString() или String.Format()?
а вы сами как думаете?
0
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
19.04.2010, 15:06
Цитата Сообщение от Sergei Посмотреть сообщение
String.Format("{0:F10}",s).TrimEnd( del)
честно сказать, я не уверен, что это будет работать быстрее,чем мой конвертер.

да и вообще, свой вопрос и вопрос скорости хочу снять,потому что есть готовый expression evaluator на ассемблере (видел пример на делфи, работает в очень много раз быстрее, чем то,что у меня), и я уверен,что на .NET уже есть "самый быстрый" распознаватель. если ктонибудь уже встречал, то у меня просьба поделиться ссылкой, я уже вторые сутки ищу)
0
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
19.04.2010, 18:27
Цитата Сообщение от junkier Посмотреть сообщение
честно сказать, я не уверен, что это будет работать быстрее,чем мой конвертер.
Для особо любопытных написал программу для теста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
 
namespace TestDoubleToString
{
    class TestDoubleToStr
    {
        double[] _numbers;
        string[] _strings;
        public int Numbers { get; set; }
 
        public TestDoubleToStr()
        {
 
        }
        public TestDoubleToStr( int num)
        {
            _numbers = new double[num];
            _strings = new string[num];
 
            Numbers = num;
            Random rd = new Random();
            for (int i = 0; i < num; i++)
            {
                _numbers[i] = rd.NextDouble();
            }
        }
 
        private string DoubleToStringF(double d)
        {
            char[] del = { '0', ',', '.' };
           return String.Format("{0:F20}", d).TrimEnd(del);
        }
        
         private string ConvDoubToStr(double doub)
        {
            string str = ((int)doub).ToString();
            double k = (doub - (int)doub);
            if (k > 0)
                str += ",";
            while (k > 0)
            {
                k = k * 10;
                switch ((int)k)
                {
                    case 0:
                        str += "0";
                        break;
                    case 1:
                        str += "1";
                        break;
                    case 2:
                        str += "2";
                        break;
                    case 3:
                        str += "3";
                        break;
                    case 4:
                        str += "4";
                        break;
                    case 5:
                        str += "5";
                        break;
                    case 6:
                        str += "6";
                        break;
                    case 7:
                        str += "7";
                        break;
                    case 8:
                        str += "8";
                        break;
                    case 9:
                        str += "9";
                        break;
                }
                k = k - (int)k;
            }
            return str;
 
        
        }
         public long TestConvert1()
         {
             Stopwatch sw = new Stopwatch();
             sw.Start();
             for (int i = 0; i < Numbers; i++)
             {
                 _strings[i] = DoubleToStringF(_numbers[i]);
             }
             return sw.ElapsedMilliseconds;
         }
 
         public long TestConvert2()
         {
             Stopwatch sw = new Stopwatch();
             sw.Start();
             for (int i = 0; i < Numbers; i++)
             {
                 _strings[i] = ConvDoubToStr(_numbers[i]);
             }
             return sw.ElapsedMilliseconds;
         }
         public void ShowStrings()
         {
             for (int i = 0; i < Numbers; i++)
             {
                 Console.WriteLine(_strings[i]);
             }
         }
        public void ShowNumbers()
        {
            for (int i = 0; i < Numbers; i++)
            {
                Console.WriteLine("{0:F20}", _numbers[i]);
               // Console.WriteLine( _numbers[i].ToString());
            }
        }
    }
}
И вот результаты.
для конвертирования бралось int n = 100000; чисел
результат с применением string.Format 260 миллисекунд
результат с применением ФункцииConvDoubToStr 700 миллисекунд
1
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
19.04.2010, 21:57
хоу хоу хоу!!
Sergei, спасибо большое за такой тест, а я на будущее учту))

уже заменил в своей программе,но поиски преобразователя "на асме" не прекращаю... уже даже узнал про Обратную польскую запись выражений, но надежды найти не теряю)
0
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
19.04.2010, 23:52
junkier, Удачи в поисках как найдете расскажите.
0
4 / 4 / 2
Регистрация: 17.04.2010
Сообщений: 55
21.04.2010, 22:06
Ищу Аналог Pegtopmath на C#
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2010, 22:06
Помогаю со студенческими работами здесь

Флаги форматирования
Здравствуйте. Есть число типа дабл, которое является бесконечным. Как вывести его в сообщения чтобы выводилось только 3 символа после...

Флаги форматирования cout
В чем разница, кроме того, что первые два флага форматирования задаются в качестве манипуляторов? cout &lt;&lt;...

Флаги форматирования и манипуляторы
У многих новичков возникают вопросы, как вывести число в таком-то формате, а можно вывести так или так. Чтоб стало более ясно, вот...

Флаги форматирования метода printf
System.out.printf(&quot;Наименование: %20s \n&quot;,&quot;Стол&quot;); System.out.printf(&quot;Вес: %20s \n&quot;, &quot;20 кг&quot;); Получается результат: Наименование:...

Флаги форматирования в cout, выравнивание справа
Вот код. Я установил флаг форматирования райт. Поток перегружен и на консоль выводится площадь и периметр, вот только они нисколько не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru