【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));
相关推荐
yufei-coder7 分钟前
C#基础语法
开发语言·c#·.net
长天一色7 分钟前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
sukalot16 分钟前
windows C++-windows C++-使用任务和 XML HTTP 请求进行连接(二)
c++·windows
_.Switch19 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
醉颜凉22 分钟前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
NiNg_1_23427 分钟前
Vue3 Pinia持久化存储
开发语言·javascript·ecmascript
带带老表学爬虫36 分钟前
java数据类型转换和注释
java·开发语言
qianbo_insist39 分钟前
simple c++ 无锁队列
开发语言·c++
zengy539 分钟前
Effective C++中文版学习记录(三)
数据结构·c++·学习·stl
cyt涛1 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok