Почему функция toLocaleString() не срабатывает после применения toFixed()?

Привет всем! У меня есть задача: необходимо заменить разделитель в числе с точки на запятую, сохраняя определённую точность, чтобы впоследствии можно было скопировать результат в Excel. <br/> Можете объяснить, почему этот код работает? <br/> <pre><code class="javascript">var a = 12.34;
a.toLocaleString() // 12,34</code></pre> <br/> <br/> А почему этот код не дает ожидаемого результата? <br/> <pre><code class="javascript">var a = 12.34;
a.toFixed(2).toLocaleString() // 12.34</code></pre>
  • 19 октября 2024 г. 18:02
Ответы на вопрос 2
Функция `toLocaleString()` не срабатывает как ожидается после применения `toFixed()` из-за того, что `toFixed()` возвращает строку, а не число. 

Давайте разберём подробнее:

1. В первом примере:

   ```javascript
   var a = 12.34;
   a.toLocaleString();
   ```
   
   Здесь `a` — это число, и при вызове `toLocaleString()` оно преобразуется в строку с учётом локализации, заменяя разделитель десятичной части на запятую (если локализация настроена соответствующим образом).

2. Во втором примере:

   ```javascript
   var a = 12.34;
   a.toFixed(2).toLocaleString();
   ```

   Здесь `a.toFixed(2)` возвращает строку `"12.34"` (в зависимости от локали, последний аргумент определяется на основе контекста, в данном случае, если используется английская локаль, то десятичный разделитель будет точкой). Затем, когда вы пытаетесь вызвать метод `toLocaleString()` на этой строке, это вызывает ошибку, потому что строка не имеет метода `toLocaleString()`.

Для того чтобы данный код работал как ожидается, нужно привести результат `toFixed()` обратно к типу `Number`, что можно сделать следующим образом:

```javascript
var a = 12.34;
Number(a.toFixed(2)).toLocaleString(); // будет работать
```

Теперь `toLocaleString()` будет применён к числу, и вы получите результат в нужном формате в зависимости от локализации.

Если вам нужно заменить точку на запятую, вы можете сделать это вручную, например:

```javascript
var a = 12.34;
var result = a.toFixed(2).replace('.', ','); // "12,34"
```

Таким образом, вы получите строку с нужными вам разделителями.
потому что Number.toFixed() на удивление возвращает строку, для строки нужно что-то типа .replace('.', ',') 

ПЛЮС: ну или сношения с Math.round() и потом .toLocaleString()
да и .toLocaleString() использует локаль браузера, которая не всегда бывает нужная, да ещё и вставит пробелы или запятые между разрядами
уж если нужен конкретный формат, то ЕМНИП .toLocaleString() принимает локаль в качестве параметра
Похожие вопросы