• [Rust] 数据类型的转换


    数据类型的转换

    类型转换的方式

    Rust 提供了多种类型转换的方式。

    • as T

      用于数类型之间的转换。ixx, uxx, fxx 都可以。
      注意:当溢出的时候,转换不会 panic,而是循环映射值。

    fn as_type() {
        // i32 -> i8
        println!("{}", 127i32 as i8);
        // output: 127
        println!("{}", 128i32 as i8);
        // output: -128
    
        // f64 -> i32 (floor)
        println!("{}", -10000.678f64 as i32);
        // output: -10000
    
        // integer divide
        for i in 1..10 {
            print!("{} ", i / 2);
        }
        // output: 0 1 1 2 2 3 3 4 4
        println!();
    
        // float divide
        for i in 1..10 {
            print!("{} ", i as f64 / 2.0);
        }
        // output: 0.5 1 1.5 2 2.5 3 3.5 4 4.5
        println!();
    }
    
    • TryFrom/TryInto
      可以在不同的数类型之间转换,越界时,会返回错误。
      TryFrom/TryInto 的结果是 Result<T, Error>
    use std::convert::TryFrom;
    use std::convert::TryInto;
    
    fn try_from_try_into() {
        println!("{}", i8::try_from(32i32).unwrap());
        // output: 32, panic if the value is not fit to i8.
        let i_8: i8 = 32i32.try_into().unwrap();
        println!("{}", i_8);
        // output: 32, panic if the value is not fit to i8.
    }
    
    • From/Into
      只能从小范围数类型变成大的数类型。安全。
      也可以用于 strString 之间的转换。
    use std::convert::From;
    use std::convert::Into;
    
    fn from_into() {
        println!("{}", i32::from(127i8));
        // output: 127
        let i_32: i32 = 127i8.into();
        println!("{}", i_32);
        // output: 127
    }
    
    • unsafe
    // Cargo.toml
    // [dependencies]
    // rand = "0.8.3"
    use rand::random;
    
    fn unsafe_f64() {
        println!("{}", unsafe {
            f64::to_int_unchecked::<usize>(random::<f64>() * 100.0)
        });
        // output: 67
    }
    
    • to_string/parse

    用于字符串和数类型之间转换

    fn to_string_parse() {
        // string -> float
        let s = "123.456";
        println!("{} ", s.parse::<f64>().unwrap());
        // output: 123.456
    
        // float -> string
        let f_64 = 123.456;
        println!("{} ", f_64.to_string());
        // output: 123.456
    
        // float -> string
        let f_64 = 123.456;
        println!("{} ", f_64.to_string());
        // output: 123.456
    }
    

    在日期和字符串之间转换

    // Cargo.toml
    // [dependencies]
    // chrono = "0.4"
    use chrono::*;
    
    fn date_time() {
        let locale = Local.ymd(2020, 12, 05).and_hms(12, 0, 9);
        println!("{:?}", locale.format("%Y-%m-%d %H:%M:%S.%s").to_string());
        // "2020-12-05 12:00:09.1607140809"
    
        println!("{:?}", locale.format("%a %b %e %T %Y").to_string());
        // "Sat Dec  5 12:00:09 2020"
    
        println!("{:?}", locale.format("%c").to_string());
        // "Sat Dec  5 12:00:09 2020"
    
        println!("{:?}", locale.to_string());
        // "2020-12-05 12:00:09 +08:00"
    
        println!("{:?}", locale.to_rfc2822());
        // "Sat, 05 Dec 2020 12:00:09 +0800"
    
        println!("{:?}", locale.to_rfc3339());
        // "2020-12-05T12:00:09+08:00"
    
        let date_str = "2020-04-12 22:10:57";
        let naive_datetime = NaiveDateTime::parse_from_str(date_str, "%Y-%m-%d %H:%M:%S").unwrap();
        println!("{:?}", naive_datetime.to_string());
        // "2020-04-12 22:10:57"
    
        let date_str = "2020-04-12 22:10:57 +02:00";
        let datetime = DateTime::parse_from_str(date_str, "%Y-%m-%d %H:%M:%S %z").unwrap();
        println!("{:?}", datetime.to_string());
        // "2020-04-12 22:10:57 +02:00"
    
        let date_str = "2020-04-12";
        let naive_date = NaiveDate::parse_from_str(date_str, "%Y-%m-%d").unwrap();
        println!("{:?}", naive_date.to_string());
        // "2020-04-12"
    
        let time_str = "22:10:57";
        let naive_time = NaiveTime::parse_from_str(time_str, "%H:%M:%S").unwrap();
        println!("{:?}", naive_time.to_string());
        // "22:10:57"
    }
    
    非常感谢阅读!如有不足之处,请留下您的评价和问题。
    请“推荐”本文!
  • 相关阅读:
    MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例
    2018-2019-1 20189221《Linux内核原理与分析》第五周作业
    2018-2019-1 20189221 《构建之法》第 2 周学习总结
    2018-2019-1 20189221 《从问题到程序》第 4 周学习总结
    2018-2019-1 20189221 《深入理解计算机系统》第 2 周学习总结
    2018-2019-1 20189221 《从问题到程序》第 3 周学习总结
    2018-2019-1 20189221《Linux内核原理与分析》第四周作业
    2018-2019-1 20189221 《从问题到程序》第二周学习总结
    2018-2019-1 20189221《Linux内核原理与分析》第三周作业
    2018-2019-1 20189221 《构建之法》第一周学习总结
  • 原文地址:https://www.cnblogs.com/steven-yang/p/14737222.html
Copyright © 2020-2023  润新知