📄 gbx_local.c
字号:
PUBLIC void LOCAL_set_lang(const char *lang){ if (lang) { my_setenv("LANG", lang, &env_LANG); my_setenv("LC_ALL", lang, &env_LC_ALL); if (getenv("LANGUAGE")) my_setenv("LANGUAGE", lang, &env_LANGUAGE); } if (setlocale(LC_ALL, "") == NULL) printf("Warning: setlocale: cannot switch to language %s\n", LOCAL_get_lang()); local_trans = TRUE; fill_local_info();}PUBLIC bool LOCAL_format_number(double number, int fmt_type, const char *fmt, long len_fmt, char **str, long *len_str, bool local){ char c; long n; char buf[32]; char *buf_start; long pos; long pos2; int thousand; int *thousand_ptr; char sign; bool comma; bool point; int before, before_zero; int after, after_zero; char exposant; char exp_sign; int exp_digit; int exp_zero; int number_sign; double number_mant; int number_exp; int number_real_exp; int ndigit; int pos_first_digit; //bool intl_currency; if (local) local_current = &LOCAL_local; else local_current = &LOCAL_default; switch(fmt_type) { case LF_USER: break; case LF_STANDARD: case LF_GENERAL_NUMBER: if ((number != 0.0) && ((fabs(number) < 1E-4) || (fabs(number) >= 1E7))) fmt = "0.############E+#"; else fmt = "0.############"; break; case LF_FIXED: fmt = "0.00"; break; case LF_PERCENT: fmt = "###%"; break; case LF_SCIENTIFIC: fmt = "0.##################E+#"; break; /*case LF_CURRENCY: fmt = local_current->general_currency; break; case LF_INTERNATIONAL: fmt = local_current->intl_currency; break;*/ default: return TRUE; } if (len_fmt == 0) len_fmt = strlen(fmt); if (len_fmt >= COMMON_BUF_MAX) return TRUE; /* on recherche les formats de nombre n�atif et nul */ pos = search(fmt, len_fmt, ";", 0, FALSE); if (number <= 0.0) { if (pos < len_fmt) { if (number < 0.0) { if ((pos < (len_fmt - 1)) && fmt[pos + 1] != ';') { fmt = &fmt[pos + 1]; len_fmt -= pos + 1; } else len_fmt = pos; } else /* nombre �al �0 */ { pos2 = search(fmt, len_fmt, ";", pos + 1, FALSE); if (pos2 < len_fmt) { if ((pos2 < (len_fmt - 1)) && fmt[pos2 + 1] != ';') { fmt = &fmt[pos2 + 1]; len_fmt -= pos2 + 1; } else len_fmt = pos; } } } } else if (pos < len_fmt) len_fmt = pos; /* on transcrit le format pour sprintf */ sign = 0; comma = FALSE; before = 0; before_zero = 0; point = FALSE; after = 0; after_zero = 0; exposant = 0; exp_sign = 0; exp_zero = 0; //_currency = FALSE; //intl_currency = FALSE; begin(); /* Recherche du '%' */ pos = search(fmt, len_fmt, "%", 0, FALSE); if (pos < len_fmt) number *= 100; /* pr�ixe de formatage */ //pos = search(fmt, len_fmt, "-+#0.,($", 0, FALSE); pos = search(fmt, len_fmt, "-+#0.,", 0, FALSE); if (pos >= len_fmt) return TRUE; if (pos > 0) add_string(fmt, pos, NULL); /* on d�ermine le signe */ if (fmt[pos] == '-') { sign = ' '; pos++; } else if (fmt[pos] == '+') { sign = '+'; pos++; } else if (fmt[pos] == '(') { sign = '('; pos++; } if (pos >= len_fmt) return TRUE; /* mon�aire */ /*if (fmt[pos] == '$') { _currency = TRUE; pos++; if (fmt[pos] == '$') { intl_currency = TRUE; pos++; } }*/ /* Les chiffres avant la virgule */ for(; pos < len_fmt; pos++) { c = fmt[pos]; if (c == ',') { comma = TRUE; continue; } if (c == '#' || c == '0') { before++; if (c == '0' || before_zero > 0) before_zero++; continue; } break; } if (pos >= len_fmt) goto _FORMAT; /* La virgule */ if (fmt[pos] != '.') goto _FORMAT; pos++; point = TRUE; if (pos >= len_fmt) goto _FORMAT; /* Les chiffres apr� la virgule */ for(; pos < len_fmt; pos++) { c = fmt[pos]; if (c == '#' || c == '0') { after++; if (c == '0') after_zero = after; continue; } break; } if (pos >= len_fmt) goto _FORMAT; /* L'exposant */ if (fmt[pos] == 'e' || fmt[pos] == 'E') { exposant = fmt[pos]; exp_sign = ' '; pos++; if (pos >= len_fmt) return TRUE; if (fmt[pos] == '-') { pos++; } else if (fmt[pos] == '+') { exp_sign = '+'; pos++; } if (pos >= len_fmt) return TRUE; for(; pos < len_fmt; pos++) { c = fmt[pos]; if (c == '#' || c == '0') { exp_digit++; if (c == '0' || exp_zero > 0) exp_zero++; continue; } break; } }_FORMAT: if (before == 0 && after == 0) return TRUE; /* le signe */ number_sign = fsgn(number); add_sign(sign, number_sign, FALSE); /* la monnaie (avant) */ /*if (_currency) { int test = (number_sign < 0) + (intl_currency << 1); if (local_current->currency_flag & (1 << test)) { add_currency(intl_currency ? local_current->intl_currency_symbol : local_current->currency_symbol); if (local_current->currency_flag & (1 << (test + 4))) put_char(' '); } }*/ /* le nombre */ number_mant = frexp10(fabs(number), &number_exp); /* 0.0 <= number_mant < 1.0 */ //number_exp++; /* simplifie les choses */ number_real_exp = number_exp; if (exposant != 0) number_exp = number != 0.0; ndigit = sprintf(buf, "%.*f", MinMax(after + number_exp, 0, DBL_DIG), number_mant); // should return "0[.]...", or "1[.]..." if the number is rounded up. buf_start = buf; if (buf_start[0] == '1') // the number has been rounded up. { if (exposant) number_real_exp++; else number_exp++; } if (ndigit > 1) // so there is a point { if (buf_start[0] == '0') { buf_start += 2; ndigit -= 2; } else { buf_start[1] = buf_start[0]; ndigit--; buf_start++; } while (ndigit > 0 && buf_start[ndigit - 1] == '0') ndigit--; } /* We note where the first digit will be printed */ pos_first_digit = buffer_pos; /* les chiffres avant la virgule */ thousand = Max(before_zero, number_exp); thousand_ptr = comma ? &thousand : NULL; if (number_exp > 0) { if (before_zero > number_exp) add_zero(before_zero - number_exp, thousand_ptr); add_string(buf_start, Min(number_exp, ndigit), thousand_ptr); if (number_exp > ndigit) add_zero(number_exp - ndigit, thousand_ptr); } else { if (before_zero > 0) add_zero(before_zero, thousand_ptr); } /* la virgule */ if (point) put_char(local_current->decimal_point); /* les chiffres apr� la virgule */ if ((ndigit - number_exp) > 0) { if (number_exp < 0) { n = Min(after, (- number_exp)); if (n == after) { add_zero(after_zero, NULL); goto _EXPOSANT; } else { add_zero(n, NULL); after -= n; after_zero -= n; } } if (number_exp > 0) { buf_start += number_exp; ndigit -= number_exp; } n = Min(ndigit, after); if (n > 0) { add_string(buf_start, n, NULL); after -= n; after_zero -= n; } if (after_zero > 0) add_zero(after_zero, NULL); } else add_zero(after_zero, NULL);_EXPOSANT: /* On enl�e la virgule si elle se trouve �la fin */ buffer_pos--; if (look_char() != local_current->decimal_point) buffer_pos++; /* exposant */ if (exposant != 0) // && number != 0.0) { put_char(exposant); n = sprintf(buf, "%+.*d", exp_zero, number_real_exp - 1); add_string(buf, n, NULL); } /* la monnaie (apr�) */ /*if (_currency) { int test = (number_sign < 0) + (intl_currency << 1); if (!(local_current->currency_flag & (1 << test))) { if (local_current->currency_flag & (1 << (test + 4))) put_char(' '); add_currency(intl_currency ? local_current->intl_currency_symbol : local_current->currency_symbol); } }*/ /* On ignore la parenth�e finale dans le format */ /*if (sign == '(' && fmt[pos] == ')') pos++;*/ /* Le signe apr� */ add_sign(sign, number_sign, TRUE); /* print at least a zero */ if (buffer_pos == pos_first_digit) put_char('0'); /* suffixe de formatage */ if (pos < len_fmt) add_string(&fmt[pos], len_fmt - pos, NULL); /* on retourne le r�ultat */ end(str, len_str); return FALSE;}#if 0PUBLIC boolean old_LOCAL_format_number(double number, int fmt_type, const char *fmt, long len_fmt, char **str, long *len_str, boolean local){ char c; long n; char buf[32]; char *buf_start; long pos; long pos2; int thousand; int *thousand_ptr; char sign; boolean comma; boolean point; int before, before_zero; int after, after_zero; char exposant; char exp_sign; int exp_digit; int exp_zero; int number_sign; double number_mant; int number_exp; int number_real_exp; int ndigit; if (local) local_current = &LOCAL_local; else local_current = &LOCAL_default; switch(fmt_type) { case LF_USER: break; case LF_STANDARD: case LF_GENERAL_NUMBER: if ((number != 0.0) && ((fabs(number) < 1E-4) || (fabs(number) >= 1E7))) fmt = "0.############E+#"; else fmt = "0.############"; break; case LF_FIXED: fmt = "0.00"; break; case LF_PERCENT: fmt = "###%"; break; case LF_SCIENTIFIC: fmt = "0.##################E+#"; break; default: return TRUE; } if (len_fmt == 0) len_fmt = strlen(fmt);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -