[<<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 }