[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Пример - Использование информации о формате чисел
Функция на следующей странице получает значение типа double и
возвращает указатель на строку символов, представляющую это значение
как денежную сумму. Эта функция предполагает, что категории локали
LC_MONETARY и LC_NUMERIC перед вызовом этой функции были установлены
вызовом setlocale(3C). Эта программа работает так:
9 Объявляется указатель на struct lconv.
11 Вызывается localeconv(3C). Она возвращает указатель на
struct lconv, заполненную информацией о формате чисел и
денежных сумм для данной локали.
13 Значение параметра преобразуется в ASCII-строку. Поле
frac_digits содержит количество десятичных знаков, которые
нужно выводить при форматировании денежной суммы.
srpintf(3C) использует поле decimal_point при печати
значений с плавающей точкой. Значение этого символа хранится
в базе данных LC_NUMERIC.
14-16 Поле decimal_point используется для не-денежных значений.
Поскольку эта функция печатает денежную сумму, символ
десятичной точки должен быть заменен на символ, заданный
полем mon_decimal_point. Обратите внимание, что для простоты
эта программа предполагает, что численная и денежная
десятичные точки имеют длину 1 байт.
18-27 Поле p_cs_precedes содержит 0 или 1, если символ валюты
печатается перед числом или после него. Поле p_sep_by_space
содержит 1 или 0, если символ валюты отделяется пробелом от
числа или не отделяется.
29 Возвращается адрес форматированной денежной суммы.
Программа может быть проверена такой функцией main:
1 #include <locale.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 char *printm(double);
5
6 main()
7 {
8 char *p;
9
10 setlocale(LC_MONETARY, "");
11 p = printm(1234567.8912);
12 printf("%s\n", p);
13 }
Для проверки этой программы, вы можете устанавливать переменную locale
в различные значения. Обратите внимание, что эта функция выдает в
правильном формате только положительные значения. Ее нужно улучшить,
чтобы она учитывала также положительный знак локали и разделитель на
тысячи.
Файлы: main.c и printm.c
ПРИМЕР - ИСПОЛЬЗОВАНИЕ ИНФОРМАЦИИ О ФОРМАТЕ ЧИСЕЛ
1 #include <locale.h>
2 #include <stdio.h>
3 #include <string.h>
4
5 char *printm(double money)
6 {
7 char tmp[50], *p;
8 static char buf[70];
9 struct lconv *lc;
10
11 lc = localeconv();
12
13 sprintf(tmp, "%.*f", lc->frac_digits, money);
14 p = strchr(tmp, *lc->decimal_point);
15 if (p != NULL)
16 *p = *lc->mon_decimal_point;
17
18 if (lc->p_cs_precedes)
19 if (lc->p_sep_by_space)
20 sprintf(buf,"%s %s",lc->currency_symbol,tmp);
21 else
22 sprintf(buf,"%s%s",lc->currency_symbol,tmp);
23 else
24 if (lc->p_sep_by_space)
25 sprintf(buf,"%s %s",tmp,lc->currency_symbol);
26 else
27 sprintf(buf,"%s%s",tmp,lc->currency_symbol);
28
29 return(buf);
30 }