2014-04-21 14 views
6

Vì vậy, tôi đã viết một phương thức trợ giúp nhỏ để chuyển đổi số thành định dạng tiền hợp lệ ($xx,xxx.xx) sử dụng .toLocaleString(). Mọi thứ hoạt động như mong đợi khi sử dụng nó bên trong Chrome, tuy nhiên nó có vẻ hoàn toàn bị hỏng khi sử dụng bên trong Node.js.Sử dụng .toLocaleString() trong Node.js

Ví dụ:

var n = 6000 
console.log(n.toLocaleString('USD', { 
    style: 'currency', 
    currency: "USD", 
    minimumFractionDigits : 2, 
    maximumFractionDigits : 2 
})); 

Nếu bạn chạy này trong trình duyệt, nó in $6,000.00. Nếu bạn chạy đoạn mã này bên trong Node.js REPL hoặc ứng dụng, nó trả về 6000 làm Chuỗi.

Đoán đây là lỗi với Node.js? Có một công việc xung quanh bạn có thể làm ở đây?

+0

Hãy xem http://stackoverflow.com/questions/17935594/can-i-get-node-to-output-commas-in-number-strings-without-bringing-in-i18n Chúng tham chiếu đến vấn đề github dường như cho thấy rằng đó là một lỗi/tính năng vì họ không muốn bao gồm hỗ trợ i18n theo mặc định. Tuy nhiên bạn có thể biên dịch phiên bản nút của riêng bạn với hỗ trợ bao gồm nếu nó quan trọng đối với bạn. – TheShellfishMeme

+0

@TheShellfishMeme Tốt bắt! Nó không phải là 100%, nhưng tôi có thể thay đổi nó để làm việc cho những gì tôi cần. –

Trả lời

13

Dựa trên this issue có vẻ như đã quyết định rằng việc giao hàng node.js với quốc tế hóa sẽ khiến nó quá lớn. Bạn có thể npm install intl và yêu cầu điều đó và nó sẽ thay thế toLocaleString bằng phiên bản hoạt động.

+0

Thật không may 'intl''s' .LocaleString() 'gắn thêm 'US' vào đầu số tiền được trả về. ('US $ 50,000.00') –

+0

@ Dropped.on.Caprica Bạn có thể' .toLocaleString (...). Slice (2) 'để loại bỏ chúng. Hoặc sử dụng chức năng tùy chỉnh; nó phụ thuộc vào cách sử dụng khác bạn sẽ nhận được ra khỏi 'intl'. –

+1

Thành thật mà nói tôi chắc chắn 90% tôi sẽ đi với một cái gì đó tùy chỉnh.Thêm một workaround vào một workaround không phải là tối ưu, cộng với tôi không có sử dụng thực sự khác của 'intl' khác hơn là một phương thức' .toLocaleString() 'cố định. Cảm ơn cho tip trên 'intl' mặc dù. –

3

Chỉ trong trường hợp người khác tình cờ gặp phải điều này, dưới đây là cách tôi định dạng một số thành một chuỗi đô la Mỹ hợp lệ trong khi ở trong môi trường Node.js.

Number.prototype.toMoney = function() { 
    var integer = this.toString().split('.')[0]; 
    var decimal = this.getDecimal(); 

    integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ","); 

    if(!decimal || !decimal.length) { 
    decimal = "00"; 
    } else if (decimal.length === 1) { 
    decimal += '0'; 
    } else if (decimal.length > 2) { 
    decimal = decimal.substr(0, 2); 
    } 

    return '$' + integer + '.' + decimal; 
}; 

Number.prototype.getDecimal = function() { 
    var n = Math.abs(this); 
    var dec = n - Math.floor(n); 
    dec = (Math.round(dec * 100)/100).toString(); 

    if(dec.split('.').length) { 
    return dec.split('.')[1]; 
    } else return ""; 
}; 

Có một vài boo-boo ở đây, cụ thể là mở rộng nguyên mẫu gốc Number. Bạn sẽ muốn tránh điều này là 90% thời gian; điều này cụ thể hơn cho việc triển khai cụ thể của tôi.

Tôi blatantly đã đánh cắp regex để định dạng dấu phẩy từ this question. và tấn công cùng nhau sự hỗ trợ thập phân của ước muốn của riêng tôi. Mileage có thể thay đổi.

0

Vì vậy, để cập nhật này cho bất cứ ai phải đối mặt với cùng một vấn đề ...

Chúng tôi đã sử dụng intl cho giải pháp nội địa hóa của chúng tôi khi server side rendering, nhưng gần đây chúng tôi đã có một yêu cầu thêm {timeZoneName: 'short'}-.toLocaleString() lựa chọn của chúng tôi và lĩnh vực này không được hỗ trợ.

Source Code từ intl.js:

case 'timeZoneName': 
    fv = ''; // ###TODO 
    break; 

Bên cạnh đó, đã có một sự thay đổi phá vỡ trong phiên bản vá lỗi mới nhất mà chúng tôi buộc phải để khóa xuống phiên bản của chúng tôi để 1.2.4.

Cuối cùng, chúng tôi đã giảm sử dụng intl có lợi cho full-icu. Đơn giản chỉ cần thêm nó vào yarn.lock của chúng tôi đã giải quyết tất cả các vấn đề nội địa hóa ngày của máy chủ Node.js của chúng tôi. Chưa xác minh nội tệ hóa, nhưng cho đến nay rất tốt. Tôi khuyên bạn nên thử.

Các vấn đề liên quan