2009-06-18 29 views
12

Tôi đã nhập tiền tệ và chỉ cần trả về các chữ số có nghĩa. Các đầu vào luôn luôn có hai chữ số thập phân, vì vậy:chop số thập phân chưa sử dụng với javascript

4.00 -> 4 
4.10 -> 4.1 
4.01 -> 4.01 

Đây là cách tôi đang làm việc đó:

// chop off unnecessary decimals 
if (val.charAt(val.length-1) == '0') { // xx.00 
    val = val.substr(0, val.length-1); 
} 
if (val.charAt(val.length-1) == '0') { // xx.0 
    val = val.substr(0, val.length-1); 
} 
if (val.charAt(val.length-1) == '.') { // xx. 
    val = val.substr(0, val.length-1); 
} 

mà làm việc, và có một thẳng nhất định với nó rằng tôi giống như, nhưng có thể có một cách đẹp hơn.

Tôi cho rằng tôi có thể sử dụng một vòng lặp và chạy qua nó ba lần, nhưng điều đó thực sự có vẻ như nó sẽ ít nhất là cồng kềnh khi tôi điều kiện hóa câu lệnh if. Khác hơn thế, bất kỳ ý tưởng? Tôi tưởng tượng có một cách regex để làm điều đó, quá ....

Trả lời

14

Tôi tin rằng parseFloat() thực hiện việc này.

parseFloat(4.00) // 4 
parseFloat(4.10) // 4.1 
parseFloat(4.01) // 4.01 
+1

Một phao có thể không có đủ độ chính xác để phản ánh đúng giá trị thập phân nhất định; bạn không bao giờ nên sử dụng chúng để đại diện cho tiền tệ. –

+0

Đó là sự thật. –

+0

Tôi nghĩ rằng chúng sẽ được thể hiện chính xác miễn là bạn không thực hiện các thao tác trên chúng. Và bạn không thể thực hiện các phép toán theo số thập phân trong JavaScript dù sao (không có một thư viện thập phân sử dụng chuỗi hoặc một mảng các số nguyên bên trong). – Nosredna

1
String(4) // "4" 
String(4.1) // "4.1" 
String(4.10) // "4.1" 
String(4.01) // "4.01" 

parseFloat hoạt động, nhưng bạn đã có để cast nó trở lại thành một chuỗi.

14

Mã của bạn cũng tắt số 0 ở các số như "1000". Một biến thể tốt hơn là chỉ cắt các số 0 sau dấu thập phân. Việc thay thế cơ bản bằng các cụm từ thông dụng sẽ trông như sau:

str.replace(/(\.[0-9]*?)0+$/, "$1"); // remove trailing zeros 
str.replace(/\.$/, "");    // remove trailing dot 
+2

Tốt hơn để sử dụng 0+ thay vì 0 * để regex không khớp nếu không có dấu 0. – llimllib

+0

Bạn nói đúng, 0 * với số 0 không trùng khớp không làm gì hữu ích. Nhưng ít nhất nó cũng không gây hại gì. – sth

+0

Đối với các nhà nghiên cứu trong tương lai: nhận xét trước đó không còn liên quan – Denis

2

Vì vậy, bạn bắt đầu bằng một chuỗi và bạn muốn có kết quả chuỗi, đúng không?

val = "" + parseFloat(val); 

Điều đó sẽ hiệu quả. Các ngắn gọn hơn

val = "" + +val; 

hoặc

val = +val + ""; 

sẽ làm việc là tốt, nhưng hình thức đó là quá khó hiểu.

Các công trình này hoạt động như thế nào? Họ chuyển đổi chuỗi thành một số rồi quay lại một chuỗi. Bạn có thể không muốn sử dụng chúng, nhưng biết cách hoạt động của các chuyển đổi JavaScript sẽ giúp bạn gỡ lỗi bất cứ điều gì bạn thực hiện.

3
string to string: parseFloat(value).toFixed(2); 
string to number: +(parseFloat(value).toFixed(2)) 
number to number: Math.round(value*100)/100; 
number to string: (Math.round(value*100)/100).toFixed(2); 
0

Tôi đang cố tìm một giải pháp như vậy ngay bây giờ. Đây là cách tôi đến đây.

tôi đã sử dụng) chức năng (Số cho ứng dụng của tôi, nhưng có vẻ như nó làm việc giống như parseFloat()

http://jsfiddle.net/4WN5y/

tôi loại bỏ và dấu phẩy trước khi kiểm tra số lượng.

var valueAsNumber = Number(val.replace(/\,/g,'')); 
2

Tôi nghĩ rằng đây là những gì bạn muốn

v = 33.404034 
    v.toFixed(2) # v -> 33.40 
    parseFloat(v.toFixed(2)) # 33.4 

và bạn có

v = 33.00704034 
    v.toFixed(2) # v -> 33.01 
    parseFloat(v.toFixed(2)) # 33.01 

    v = 33.00304034 
    v.toFixed(2) # v -> 33.00 
    parseFloat(v.toFixed(2)) # 33 
Các vấn đề liên quan