【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));
相关推荐
zzb15801 小时前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
一只鹿鹿鹿1 小时前
信息安全等级保护安全建设防护解决方案(总体资料)
运维·开发语言·数据库·面试·职场和发展
喵叔哟1 小时前
9. 【Blazor全栈开发实战指南】--Blazor调用JavaScript
开发语言·javascript·udp
堕2741 小时前
MySQL数据库《基础篇--数据库索引(2)》
数据库·mysql
wei_shuo1 小时前
数据库优化器进化论:金仓如何用智能下推把查询时间从秒级打到毫秒级
数据库·kingbase·金仓
wuqingshun3141591 小时前
如何停止一个正在退出的线程
java·开发语言·jvm
我命由我123451 小时前
Element Plus - Form 的 resetField 方法观察记录
开发语言·前端·javascript·vue.js·html·html5·js
朱包林2 小时前
Python基础
linux·开发语言·ide·python·visualstudio·github·visual studio
雷工笔记2 小时前
Navicat Premium 17 软件安装记录
数据库
xiaoye-duck2 小时前
《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂
数据结构·c++·算法·递归