lua_tinker 如何正确解析德语国际化的浮点数?

由于项目需要支持国际化,所以该项目采用了 lua_tinker 封装。然而,在德国系统中,由于德国使用","作为小数点分隔符,该项目无法正确解析 lua 文件。如何强制 lua_tinker 使用"."作为小数点分隔符?

例如:

    llex.c

    static int read_numeral (LexState *LS, int period, SemInfo *seminfo) {
      //setlocale(LC_ALL,"C");
      buffreplace(LS,LS->decpoint,'.')
      int isReal = 0;
      int startsWithZero = LS->current == '0';
      size_t l = 0;
      checkbuffer(LS, l);
      if (period) {
        save(LS, '.', l);
        isReal = 1;
      }
      if (startsWithZero) {
        next(LS);
        if (LS->current == 'x') {
          /* Process a hex number */
          int ch = 0;
          int c = 0;
          int i = 0;
          int numDigits = 8;
          next(LS);
          do {
            ch = tolower(LS->current);
            if (lex_isdigit(ch))
              c = 16*c + (ch-'0');
            else if (ch >= 'a' && ch <= 'f')
              c = 16*c + (ch-'a') + 10;
            next(LS);
            ch = tolower(LS->current);
          } while (++i<numDigits && (lex_isdigit(ch) || (ch >= 'a' && ch <= 'f')));
          seminfo->r = c;
          return TK_NUMBER;
        } else {
          checkbuffer(LS, 1);
          save(LS, '0', l);
        }
      }
      while (lex_isdigit(LS->current)) {
        checkbuffer(LS, l);
        save_and_next(LS, l);
      }
      if (LS->current == '.') {
        isReal = 1;
        save_and_next(LS, l);
        if (LS->current == '.') {
          save_and_next(LS, l);
          save(LS, '\0', l);
          luaX_lexerror(LS,
                     "ambiguous syntax (decimal point x string concatenation)",
                     TK_NUMBER);
        }
      }
      while (lex_isdigit(LS->current)) {
        checkbuffer(LS, l);
        save_and_next(LS, l);
      }
      if (LS->current == 'e' || LS->current == 'E') {
        isReal = 1;
        save_and_next(LS, l);  /* read `E' */
        if (LS->current == '+' || LS->current == '-')
          save_and_next(LS, l);  /* optional exponent sign */
        while (lex_isdigit(LS->current)) {
          checkbuffer(LS, l);
          save_and_next(LS, l);
        }
      }
      save(LS, '\0', l);
      if (isReal) {
        if (!luaO_str2d(luaZ_buffer(LS->buff), &seminfo->r))
          luaX_lexerror(LS, "malformed number", TK_NUMBER);
        return TK_NUMBER;
      } else {
        if (!luaO_str2d(luaZ_buffer(LS->buff), &seminfo->r))
          luaX_lexerror(LS, "malformed integer", TK_NUMBER);
        return TK_NUMBER;
      }
    }
    //lobject.c
    int luaO_str2d (const char *s, lua_Number *result) {
      //setlocale(LC_NUMERIC,"C");
      char *endptr;
      lua_Number res = lua_str2number(s, &endptr);
      if (endptr == s)
          return 0;  /* no conversion */
      while (isspace((unsigned char)(*endptr))) endptr++;
      if (*endptr != '\0')
          return 0;  /* invalid trailing characters? */
      *result = res;
      return 1;
    }

关于 lua local a = 3.3 is error

点赞