【C++】手搓存储单位转换文件源码,实现byte到(B/DB)单位转换,并支持反向转换

存储单位转换是不是很麻烦

我查看了很多文章,没有一个完美的解决代码,那就干脆自己手搓

kitUnit.h

cpp 复制代码
/**
  ******************************************************************************
  * @file           : kitUnit.h
  * @author         : CircleDBA
  * @mail           : weiyuanquan@kingbase.com.cn
  * @blog           : circle-dba.blog.csdn.net
  * @date           : 24-5-23
  ******************************************************************************
 */

#ifndef KINGBASEMANAGERTOOLS_KITUNIT_H
#define KINGBASEMANAGERTOOLS_KITUNIT_H

#include <iostream>
#include <sstream>
#include <string>
#include <any>
#include <cctype>
#include <cmath>
#include <iomanip>
#include <functional>
#include "kitStr.h"



class kitUnit {
protected:

    std::string retainNumbers(const std::string& input) {
        std::string result;
        for (char ch : input) {
            if (std::isdigit(static_cast<unsigned char>(ch))) {
                result.push_back(ch);
            }
        }
        return result;
    };

    std::map<std::string, int> UnitToInt = {
            {"BYTE", 0},
            {"B", 1},
            {"KB", 1},
            {"K", 1},
            {"MB", 2},
            {"M", 2},
            {"GB", 3},
            {"G", 3},
            {"TB", 4},
            {"T", 4},
            {"EB", 5},
            {"E", 5},
            {"ZB", 6},
            {"Z", 6},
            {"YB", 7},
            {"Y", 7},
            {"BB", 8},
            {"NB", 9},
            {"N", 9},
            {"DB", 10},
            {"D", 10},
    };
    std::pair<double,std::string> UnitStrSplit(std::string size){
        std::istringstream ss(size);
        double number = 0;
        ss >> number;
        std::string remaining;
        std::getline(ss, remaining);
        return std::make_pair(number, remaining);
    };
public:
    //存储单位转换-Byte转各种单位
    boost::any ByteToUnit(long long size, std::string unit){
        return ByteToUnit(size,unit,false);
    };
    boost::any ByteToUnit(long long size, std::string unit , bool showUnit = false)
    {
        long long result = size;
        std::string unit_str = kitStr::toUpper(unit);
        result = size / pow(1024,UnitToInt[unit_str]);

        if(showUnit){
            std::string number_str = std::to_string(result);
            std::string numberUnitStr = number_str + unit_str;
            return numberUnitStr;
        };
        return result;
    };

    //存储单位转换-带单位转换Byte
    boost::any UnitToByte(std::string size){
        return UnitToByte(size, false);
    };
    boost::any UnitToByte(std::string size,bool showUnit){
        double number;
        long long result;
        std::string number_str,unit_str;
        std::string defaultUnit = "Byte";
        std::ostringstream ss;
        if(kitStr::containsEnglish(size)){
            std::pair<double,std::string> split_str = UnitStrSplit(size);
            number = split_str.first;
            unit_str = split_str.second;
        }else{
            number = std::stod(size);
            unit_str = defaultUnit;
        }

        unit_str = kitStr::toUpper(unit_str);
        result = number * pow(1024,UnitToInt[unit_str]);
        if(showUnit){
            std::string _number_str = std::to_string(result);
            std::string numberUnitStr = _number_str + kitStr::toUpper(defaultUnit);;
            return numberUnitStr;
        };
        return result;
    };
};


#endif //KINGBASEMANAGERTOOLS_KITUNIT_H

kitStr.h

cpp 复制代码
/**
  ******************************************************************************
  * @file           : kitStr.h
  * @author         : CircleDBA
  * @mail           : weiyuanquan@kingbase.com.cn
  * @blog           : circle-dba.blog.csdn.net
  * @date           : 24-5-23
  ******************************************************************************
 */


#ifndef KINGBASEMANAGERTOOLS_KITSTR_H
#define KINGBASEMANAGERTOOLS_KITSTR_H

#include <iostream>
#include <vector>
#include <string>

#include <algorithm>

class kitStr {
protected:
public:
    static std::vector<std::string> split(const std::string &str, const char pattern) {
        std::vector<std::string> res;
        std::stringstream input(str);   //读取str到字符串流中
        std::string temp;
        //使用getline函数从字符串流中读取,遇到分隔符时停止,和从cin中读取类似
        //注意,getline默认是可以读取空格的
        while (getline(input, temp, pattern)) {
            res.push_back(temp);
        }
        return res;
    };
    static bool containsEnglish(const std::string& str) {
        for (char c : str) {
            if (std::isalpha(static_cast<unsigned char>(c))) { // 确保处理时是无符号字符
                return true;
            }
        }
        return false;
    }
    static std::string toUpper(std::string str){
        transform(str.begin(),str.end(),str.begin(),::toupper);
        return str;
    }

    static std::string toLower(std::string str){
        transform(str.begin(),str.end(),str.begin(),::tolower);
        return str;
    }
};

#endif //KINGBASEMANAGERTOOLS_KITSTR_H

示例代码:

showUnit 字段为BOOL类型 用于控制数据返回类型

本案例返回为boost::any 提取时注意处理一下

cpp 复制代码
 long long a = boost::any_cast<long long>(kitUnit::UnitToByte("1TB"));
 std::string  = boost::any_cast<string>(kitUnit::UnitToByte("1TB", true));

double c = boost::any_cast<double>(kitUnit::ByteToUnit(pow(1024,8),"TB"));
std::string d = boost::any_cast<string>(kitUnit::UnitToByte((pow(1024,5),"TB",true));
相关推荐
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148113 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl3 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu4 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT5 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData5 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean5 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean6 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
知无不研6 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
浪子明X6 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle