数字字符串格式化
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。 小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
测试样例
样例1:
输入:
s = "1294512.12412"输出:'1,294,512.12412'
样例2:
输入:
s = "0000123456789.99"输出:'123,456,789.99'
样例3:
输入:
s = "987654321"输出:'987,654,321'
解题思路
- 首先去掉字符串前面的无用的 0,可以使用
trimStart("0")方法。- 将字符串按照小数点进行分割,得到整数部分和小数部分。
- 将整数部分按照每三位进行分割,并在分割后的部分之间添加逗号。
- 将整数部分和小数部分拼接起来,得到最终的结果。
代码实现
Cangjie
RuneArray
func solution(s: String) {
let strArray = s.trimStart("0").split(".")
let integer_part = strArray[0]
var fractional_part = ""
if (strArray.size > 1) {
fractional_part = strArray[1]
}
var result = ""
let rs = integer_part.toRuneArray()
let product = rs.size / 3
let surplus = rs.size % 3
if( surplus != 0) {result = "${String(rs[..surplus])},"}
for (i in 0..product - 1) {
result += "${String(rs.slice(surplus + 3 * i, 3))},"
}
result += "${String(rs[rs.size - 3..])}"
if (fractional_part != "") {result = "${result}.${fractional_part}"}
result
}
main() {
println(solution("1294512.12412") == '1,294,512.12412')
println(solution("0000123456789.99") == '123,456,789.99')
println(solution("987654321") == '987,654,321')
}
Iterator
import std.collection.*
func solution(s: String) {
let strArray = s.trimStart("0").split(".")
let integer_part = strArray[0]
var fractional_part = ""
if (strArray.size > 1) {
fractional_part = strArray[1]
}
var result = ""
let rs = integer_part.toRuneArray()
let product = rs.size / 3
let surplus = rs.size % 3
// The same as above...
let it = rs.iterator()
let takeString = {n => String(n |> it.take |> collectArray)}
if (surplus != 0) { result = "${takeString(surplus)},"}
for (_ in 0..product - 1) { result += "${takeString(3)},"}
result += "${takeString(3)}"
// The same as above...
if (fractional_part != "") {result = "${result}.${fractional_part}"}
result
}
main() {
println(solution("1294512.12412") == '1,294,512.12412')
println(solution("0000123456789.99") == '123,456,789.99')
println(solution("987654321") == '987,654,321')
}
ArrayList
import std.collection.*
func solution(s: String) {
let strArray = s.trimStart("0").split(".")
let integer_part = strArray[0]
var fractional_part = ""
if (strArray.size > 1) {
fractional_part = strArray[1]
}
// The same as above...
var result = ''
var list = ArrayList(integer_part.toRuneArray())
while(list.size > 3 ){
result = ",${String(list[list.size-3..])}" + result
list = list[..list.size-3]
}
result = "${String(list)}${result}"
// The same as above ...
if (fractional_part != "") {
result = "${result}.${fractional_part}"
}
result
}
main() {
println(solution("1294512.12412") == '1,294,512.12412')
println(solution("0000123456789.99") == '123,456,789.99')
println(solution("987654321") == '987,654,321')
}
LinkedList
import std.collection.*
func solution(s: String) {
let strArray = s.trimStart("0").split(".")
let integer_part = strArray[0]
var fractional_part = ""
if (strArray.size > 1) { fractional_part = strArray[1] }
// The same code as before ...
var offest = 0
var result = ""
let link = LinkedList(integer_part.toRuneArray())
let iter = link.lastNode.getOrThrow() |> link.backward
for (i in 0..link.size) {
result = "${iter.next().getOrThrow()}${result}"
if (i == link.size - 1) { break }
offest ++
if (offest == 3) {
result = ",${result}"
offest = 0
}
}
// The same code as before ...
if (fractional_part != "") {
result = "${result}.${fractional_part}"
}
result
}
main() {
println(solution("1294512.12412") == '1,294,512.12412')
println(solution("0000123456789.99") == '123,456,789.99')
println(solution("987654321") == '987,654,321')
}
Rust
fn solution(s: &str) -> String {
let s = s.trim_start_matches('0');
let parts: Vec<&str> = s.split('.').collect();
let integer_part = parts[0];
let fractional_part = parts.get(1).unwrap_or(&"").to_string();
let mut result = String::new();
let mut integer_part = integer_part.to_string();
while integer_part.len() > 3 {
result = format!(",{}", &integer_part[integer_part.len() - 3..]) + &result;
integer_part = integer_part[..integer_part.len() - 3].to_string();
}
result = integer_part + &result;
if !fractional_part.is_empty() {
result += &format!(".{}", fractional_part);
}
result
}
fn main() {
println!("{}", solution("1294512.12412") == "1,294,512.12412");
println!("{}", solution("0000123456789.99") == "123,456,789.99");
println!("{}", solution("987654321") == "987,654,321");
}
Python
def solution(s: str) -> str:
s = s.lstrip('0')
if '.' in s:
integer_part, fractional_part = s.split('.')
else:
integer_part, fractional_part = s, ''
if integer_part:
integer_part = ''.join(reversed(integer_part))
integer_part = ','.join(integer_part[i:i+3]
for i in range(0, len(integer_part), 3))
integer_part = ''.join(reversed(integer_part))
if fractional_part:
return f"{integer_part}.{fractional_part}"
else:
return integer_part
print(solution("1294512.12412") == '1,294,512.12412')
print(solution("0000123456789.99") == '123,456,789.99')
print(solution("987654321") == '987,654,321')
JavaScript
function solution(s) {
s = s.replace(/^0+/, '');
let parts = s.split('.');
let integer_part = parts[0];
let fractional_part = parts[1] || '';
let result = '';
while (integer_part.length > 3) {
result = ',' + integer_part.slice(-3) + result;
integer_part = integer_part.slice(0, integer_part.length - 3);
}
result = integer_part + result;
if (fractional_part) {
result += '.' + fractional_part;
}
return result;
}
console.log(solution("1294512.12412") === '1,294,512.12412');
console.log(solution("0000123456789.99") === '123,456,789.99');
console.log(solution("987654321") === '987,654,321');
复杂度分析
- 时间复杂度:
O(n),其中n是字符串的长度。- 空间复杂度:
O(n),其中n是字符串的长度。