您的位置:首页 > 游戏 > 手游 > 【C++】手搓存储单位转换文件源码,实现byte到(B/DB)单位转换,并支持反向转换

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

2024/12/23 8:31:20 来源:https://blog.csdn.net/sinat_36528886/article/details/139161717  浏览:    关键词:【C++】手搓存储单位转换文件源码,实现byte到(B/DB)单位转换,并支持反向转换

存储单位转换是不是很麻烦
我查看了很多文章,没有一个完美的解决代码,那就干脆自己手搓

kitUnit.h

/********************************************************************************* @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;};//存储单位转换-带单位转换Byteboost::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

/********************************************************************************* @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 提取时注意处理一下

 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));

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com