Как избежать научного обозначения больших чисел в JavaScript?

Ниже приведен следующий код. С первого взгляда это может выглядеть как старый код, который я составил. Тем не менее, я посмотрел исходный код для http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc /PreparedStatement.java. Затем после этого я тщательно просмотрел код setString (int parameterIndex, String x), чтобы найти символы, которые он ускользнул, и настроил его на свой собственный класс, чтобы он мог использоваться в тех целях, которые вам нужны. В конце концов, если это список символов, которые Oracle ускользает, то знание этого действительно успокаивает безопасность. Возможно, Oracle нужно подтолкнуть добавить метод, аналогичный этому для следующей крупной версии Java.

public class SQLInjectionEscaper {

    public static String escapeString(String x, boolean escapeDoubleQuotes) {
        StringBuilder sBuilder = new StringBuilder(x.length() * 11/10);

        int stringLength = x.length();

        for (int i = 0; i < stringLength; ++i) {
            char c = x.charAt(i);

            switch (c) {
            case 0: /* Must be escaped for 'mysql' */
                sBuilder.append('\\');
                sBuilder.append('0');

                break;

            case '\n': /* Must be escaped for logs */
                sBuilder.append('\\');
                sBuilder.append('n');

                break;

            case '\r':
                sBuilder.append('\\');
                sBuilder.append('r');

                break;

            case '\\':
                sBuilder.append('\\');
                sBuilder.append('\\');

                break;

            case '\'':
                sBuilder.append('\\');
                sBuilder.append('\'');

                break;

            case '"': /* Better safe than sorry */
                if (escapeDoubleQuotes) {
                    sBuilder.append('\\');
                }

                sBuilder.append('"');

                break;

            case '\032': /* This gives problems on Win32 */
                sBuilder.append('\\');
                sBuilder.append('Z');

                break;

            case '\u00a5':
            case '\u20a9':
                // escape characters interpreted as backslash by mysql
                // fall through

            default:
                sBuilder.append(c);
            }
        }

        return sBuilder.toString();
    }
}

150
задан Mark Amery 30 April 2015 в 12:18
поделиться

2 ответа

Есть Number.toFixed , но он использует научную нотацию, если число> = 1e21 и имеет максимальную точность 20. Кроме этого, вы можете использовать свой собственный , но это будет беспорядочно.

function toFixed(x) {
  if (Math.abs(x) < 1.0) {
    var e = parseInt(x.toString().split('e-')[1]);
    if (e) {
        x *= Math.pow(10,e-1);
        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
    }
  } else {
    var e = parseInt(x.toString().split('+')[1]);
    if (e > 20) {
        e -= 20;
        x /= Math.pow(10,e);
        x += (new Array(e+1)).join('0');
    }
  }
  return x;
}

Выше используется простое и дешевое повторение строк ( (новый массив (n + 1)). join (str) ). Вы можете определить String.prototype.repeat с помощью Russian Peasant Multiplication и использовать его вместо этого.

Этот ответ следует применять только в контексте вопроса: отображение большого числа без использования экспоненциальной записи. Для чего-то еще вам следует использовать библиотеку BigInt , например BigNumber , BigInt Лимона или BigInteger . Забегая вперед, предлагаемый BigInt (примечание: не Leemon '

101
ответ дан 23 November 2019 в 21:33
поделиться

Использовать .toPrecision , .toFixed ] и т. д. Вы можете подсчитать количество цифр в номере, преобразовав его в строку с помощью .toString , а затем посмотрев на его .length .

1
ответ дан 23 November 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: