2016-01-10 3 views
5

Есть ли простой способ и динамический способ форматирования чисел в строке, чтобы они были доступны для чтения? Например, поверните 10000000000 в 10,000,000,000. Я видел this вопрос, но ответы устарели и сломаны (один пример).Человеко читаемые номера

+5

Http: // stackoverflow.com/questions/26998485/rust-print-format-number-with-thousand-separator –

ответ

2

Для моей местности это, казалось, работать! Вероятно, это не самая идиоматическая ржавчина, но она функциональна.

fn readable(mut o_s: String) -> String { 
    let mut s = String::new(); 
    let mut negative = false; 
    let values: Vec<char> = o_s.chars().collect(); 
    if values[0] == '-' { 
     o_s.remove(0); 
     negative = true; 
    } 
    for (i ,char) in o_s.chars().rev().enumerate() { 
     if i % 3 == 0 && i != 0 { 
      s.insert(0, ','); 
     } 
     s.insert(0, char); 
    } 
    if negative { 
     s.insert(0, '-'); 
    } 
    return s 
} 

fn main() { 
    let value: i64 = -100000000000; 
    let new_value = readable(value.to_string()); 
    println!("{}", new_value); 
} 
+1

Это не работает для некоторых отрицательных чисел, например, попробуйте «-100000000». –

+0

@DylanJamesMcGannon Спасибо, что указали это. Я решил эту проблему. – electrometro

4

Попробуйте этот псевдо алгоритм:

  1. Разделить длину строки на 3
  2. Круглом, что вниз, и мы будем называть его x
  3. Цикл по строке x раз, идя назад:

    1. Получить строку в x раз 3-х позицию или индекс [(x раз 3) - 1], назовем его y.
    2. Заменить y с "," + y
3

Я никогда не использовал ржавчину в моей жизни, но это то, что я придумал, переводя решение от here:

fn main() { 
    let i = -117608854; 
    printcomma(i); 
} 

fn printcomma(mut i: i32) { 
    if i < 0 { 
     print!("-"); 
     i=-i; 
    } 
    if i < 1000 { 
     print!("{}", i.to_string()); 
     return; 
    } 
    printcomma(i/1000); 
    print!(",{:03}", i%1000); 
} 

возвращает "-117,608,854"

Смежные вопросы