⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gbx_local.c

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -