7 простых способов преобразовать строку в f32 в Rust: полное руководство

Преобразование строки в число f32(число с плавающей запятой) — обычная задача в программировании на Rust. Независимо от того, имеете ли вы дело с пользовательским вводом, чтением данных из файла или анализом числовых значений из сетевого запроса, наличие нескольких методов для обработки этого преобразования может быть полезным. В этой статье мы рассмотрим семь различных способов преобразования строки в f32в Rust, дополненные примерами кода и разговорными пояснениями.

Метод 1: использование метода parse
Самый простой и понятный способ преобразовать строку в f32в Rust — использовать метод parseметод, предоставляемый типом str. Этот метод пытается преобразовать строку в определенный тип и возвращает перечисление Result. Вот пример:

fn main() {
    let number_str = "3.14";
    let number: Result<f32, _> = number_str.parse();

    match number {
        Ok(value) => println!("Parsed value: {}", value),
        Err(_) => println!("Failed to parse the string"),
    }
}

Метод 2: использование функции from_str.
Другой способ преобразовать строку в f32— использовать функцию from_str, предоставляемую модуль std::str. Эта функция работает аналогично методу parse, но возвращает Optionвместо Result. Вот пример:

use std::str;
fn main() {
    let number_str = "2.718";
    let number: Option<f32> = str::from_str(number_str);

    match number {
        Some(value) => println!("Parsed value: {}", value),
        None => println!("Failed to parse the string"),
    }
}

Метод 3: Использование синтаксиса parse::<f32>.
Rust позволяет явно указать желаемый тип при использовании метода parse. Это можно сделать с помощью синтаксиса parse::<f32>(), который указывает Rust напрямую преобразовать строку в тип f32. Вот пример:

fn main() {
    let number_str = "42.0";
    let number = number_str.parse::<f32>();

    match number {
        Ok(value) => println!("Parsed value: {}", value),
        Err(_) => println!("Failed to parse the string"),
    }
}

Метод 4: Использование крейта num-traits
Крейт num-traitsпредоставляет дополнительные возможности синтаксического анализа числовых типов в Rust. Импортировав этот ящик, вы можете использовать метод from_str_radixпризнака Numдля анализа строки в f32. Вот пример:

use num_traits::Num;
fn main() {
    let number_str = "123.45";
    let number = f32::from_str_radix(number_str, 10);

    match number {
        Ok(value) => println!("Parsed value: {}", value),
        Err(_) => println!("Failed to parse the string"),
    }
}

Метод 5: использование контейнера lexical
Крейт lexicalпредоставляет высокооптимизированные функции преобразования строк в числа. Импортировав этот ящик, вы можете использовать функцию parseдля преобразования строки в f32. Вот пример:

use lexical::parse;
fn main() {
    let number_str = "99.9";
    let number = parse::<f32, _>(number_str);

    match number {
        Ok(value) => println!("Parsed value: {}", value),
        Err(_) => println!("Failed to parse the string"),
    }
}

Метод 6: Использование функции strtofиз C
Rust позволяет вызывать функции из библиотек C с использованием интерфейса внешних функций (FFI). Используя крейт libc, вы можете вызвать функцию strtofиз стандартной библиотеки C для преобразования строки в f32. Вот пример:

use libc::strtof;
fn main() {
    let number_str = "7.77";
    let number = unsafe {
        strtof(number_str.as_ptr() as *const i8, std::ptr::null_mut())
    };

    println!("Parsed value: {}", number);
}

Метод 7: использование ящика rust_decimal
Если вам нужна точная десятичная арифметика, вы можете использовать крейт rust_decimal, который предоставляет тип Decimal. Импортировав этот ящик, вы можете проанализировать строку в Decimal, а затем преобразовать ее в f32. Вот пример:

use rust_decimal::prelude::*;
fn main() {
    let number_str = "123.456";
    let number = Decimal::from_str(number_str)
        .unwrap()
        .to_f32()
        .unwrap();

    println!("Parsed value: {}", number);
}

В этой статье мы рассмотрели семь различных методов преобразования строки в f32в Rust. Эти методы обеспечивают гибкость и возможности в зависимости от вашего конкретного варианта использования. Предпочитаете ли вы простоту встроенных методов, таких как parseи from_str, дополнительные возможности синтаксического анализа контейнеров, таких как num-traitsи lexicalили даже вызов функций C с использованием FFI, Rust предлагает несколько подходов для обработки преобразований строк в f32. Выберите метод, который лучше всего соответствует вашим потребностям, и с уверенностью погрузитесь в программирование на Rust!