Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小代码2016
calc
提交
3697be00
C
calc
项目概览
小代码2016
/
calc
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
2
Wiki
分析
仓库
DevOps
项目成员
Pages
C
calc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
2
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
3697be00
编写于
2月 15, 2023
作者:
小代码2016
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(calc_lib): decimal 初始化
上级
6172deb5
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
306 addition
and
10 deletion
+306
-10
calc_lib/.vscode/settings.json
calc_lib/.vscode/settings.json
+1
-1
calc_lib/include/khl_calc/khl_calc.h
calc_lib/include/khl_calc/khl_calc.h
+5
-0
calc_lib/include/khl_calc/khl_calc_util.h
calc_lib/include/khl_calc/khl_calc_util.h
+60
-0
calc_lib/src/khl_calc/khl_calc_decimal.cpp
calc_lib/src/khl_calc/khl_calc_decimal.cpp
+7
-6
calc_lib/src/khl_calc/khl_calc_util.cpp
calc_lib/src/khl_calc/khl_calc_util.cpp
+218
-0
calc_lib/test/testmain.cpp
calc_lib/test/testmain.cpp
+15
-3
未找到文件。
calc_lib/.vscode/settings.json
浏览文件 @
3697be00
...
...
@@ -75,6 +75,6 @@
"xtr1common"
:
"cpp"
,
"xtree"
:
"cpp"
,
"xutility"
:
"cpp"
,
"*.in"
:
"
cpp
"
"*.in"
:
"
plaintext
"
}
}
\ No newline at end of file
calc_lib/include/khl_calc/khl_calc.h
浏览文件 @
3697be00
/**
* @file khl_calc.h
* @brief 外部使用包含文件
*/
#ifndef _KHL_CALC_H_
#define _KHL_CALC_H_
#include "khl_calc/khl_calc_exception.hpp"
#include "khl_calc/khl_calc_decimal.h"
#include "khl_calc/khl_calc_util.h"
// C/C++ 跨平台时预处理判断平台环境
// 参考: https://www.cnblogs.com/Forgenvueory/p/12757271.html
...
...
calc_lib/include/khl_calc/khl_calc_util.h
0 → 100644
浏览文件 @
3697be00
/**
* @file khl_calc_util.h
* @brief 工具类
*/
#ifndef _KHL_CALC_UTIL_H_
#define _KHL_CALC_UTIL_H_
#include "khl_calc_common.h"
#include <string>
KHL_CALC_NAMESPACE_BEGIN
/**
* @brief 工具类
*/
class
CalcUtil
{
private:
/**
* @brief 是否 +
* @param ch 符号
*/
static
bool
isPlusSign
(
char
ch
);
/**
* @brief 是否 -
* @param ch 符号
*/
static
bool
isSubstractSign
(
char
ch
);
/**
* @brief 是否 .
* @param ch 符号
*/
static
bool
isDotSign
(
char
ch
);
/**
* @brief 是否 e 或 E
* @param ch 符号
*/
static
bool
isScientificSign
(
char
ch
);
/**
* @brief 是否 空格
* @param ch 符号
*/
static
bool
isSpace
(
char
ch
);
/**
* @brief 检查数字空格.
* @param s 数字
*/
static
bool
isNumberTrimValid
(
std
::
string
s
);
public:
/**
* @brief 是否数字. 支持科学计数法
* @param s 数字
*/
static
bool
isNumber
(
std
::
string
s
);
};
KHL_CALC_NAMESPACE_END
#endif // _KHL_CALC_UTIL_H_
\ No newline at end of file
calc_lib/src/khl_calc/khl_calc_decimal.cpp
浏览文件 @
3697be00
/**
* @file khl_calc_decimal.cpp
* @brief Decimal 实现
*/
#include <iostream>
#include <memory>
#include <algorithm>
#include "khl_calc/khl_calc_exception.hpp"
#include "khl_calc/khl_calc_decimal.h"
#include "khl_calc/khl_calc_util.h"
KHL_CALC_NAMESPACE_BEGIN
...
...
@@ -13,15 +18,11 @@ Decimal::Decimal(int val)
Decimal
::
Decimal
(
std
::
string
val
)
{
// 输入字符串不能为空
if
(
val
.
empty
(
))
if
(
!
CalcUtil
::
isNumber
(
val
))
{
throw
CalcDecimalInitException
(
"Init error:
input string can't be empty string
."
);
throw
CalcDecimalInitException
(
"Init error:
the input is not a number
."
);
}
// 输入字符串必须为合法的数字
auto
chars
=
val
.
c_str
();
init
(
val
);
}
Decimal
::
Decimal
(
long
val
)
...
...
calc_lib/src/khl_calc/khl_calc_util.cpp
0 → 100644
浏览文件 @
3697be00
/**
* @file khl_calc_util.cpp
* @brief CalcUtil 工具类实现
*/
#include "khl_calc/khl_calc_util.h"
#include <cctype>
KHL_CALC_NAMESPACE_BEGIN
bool
CalcUtil
::
isPlusSign
(
char
ch
)
{
return
ch
==
'+'
;
}
bool
CalcUtil
::
isSubstractSign
(
char
ch
)
{
return
ch
==
'-'
;
}
bool
CalcUtil
::
isDotSign
(
char
ch
)
{
return
ch
==
'.'
;
}
bool
CalcUtil
::
isScientificSign
(
char
ch
)
{
return
ch
==
'e'
||
ch
==
'E'
;
}
bool
CalcUtil
::
isSpace
(
char
ch
)
{
return
ch
==
' '
;
}
bool
CalcUtil
::
isNumberTrimValid
(
std
::
string
s
)
{
int
len
=
s
.
size
();
auto
chars
=
s
.
c_str
();
int
i
=
0
;
for
(;
i
<
len
;
i
++
)
{
char
ch
=
chars
[
i
];
if
(
!
isSpace
(
ch
))
{
break
;
}
}
if
(
i
==
(
len
-
1
))
{
return
false
;
}
int
j
=
0
;
for
(
j
=
len
-
1
;
j
>=
0
;
j
++
)
{
char
ch
=
chars
[
i
];
if
(
!
isSpace
(
ch
))
{
break
;
}
}
if
(
j
<=
i
)
{
return
false
;
}
return
true
;
}
bool
CalcUtil
::
isNumber
(
std
::
string
s
)
{
// 空字符串直接返回 false
if
(
s
.
empty
())
{
return
false
;
}
// 检查空格
if
(
!
isNumberTrimValid
(
s
))
{
return
false
;
}
// 空格处理
int
plusSignCount
=
0
;
int
substractSignCount
=
0
;
int
dotSignCount
=
0
;
int
scientificSignCount
=
0
;
int
digitCount
=
0
;
auto
chars
=
s
.
c_str
();
const
int
len
=
s
.
size
();
bool
flag
=
true
;
char
prev
=
0
;
int
scientificSignIndex
=
0
;
// +00123.456e-789
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
char
ch
=
chars
[
i
];
if
(
i
>=
1
)
{
prev
=
chars
[
i
-
1
];
}
if
(
isdigit
(
ch
))
{
digitCount
+=
1
;
}
else
{
if
(
isPlusSign
(
ch
))
{
plusSignCount
+=
1
;
// 如果 + 存在, 那么最多存在两个
if
(
plusSignCount
>
2
)
{
flag
=
false
;
break
;
}
// 如果 + 不在首位,那么前一个字符必须是 [e,E], 并且不能出现在最后以为
if
(
i
>
0
&&
(
!
isScientificSign
(
prev
)
||
i
==
(
len
-
1
)))
{
flag
=
false
;
break
;
}
}
else
if
(
isSubstractSign
(
ch
))
{
substractSignCount
+=
1
;
// 如果 - 存在, 那么最多存在两个
if
(
plusSignCount
>
2
)
{
flag
=
false
;
break
;
}
// 如果 - 不在首位,那么前一个字符必须是 [e,E]
if
(
i
>
0
&&
(
!
isScientificSign
(
prev
)
||
i
==
(
len
-
1
)))
{
flag
=
false
;
break
;
}
}
else
if
(
isDotSign
(
ch
))
{
// 不能只包含一个 .
if
(
0
==
i
&&
1
==
len
)
{
flag
=
false
;
break
;
}
dotSignCount
+=
1
;
// 如果 . 存在, 则只能存在一个
if
(
dotSignCount
>
1
)
{
flag
=
false
;
break
;
}
// . 不能在 [e,E] 之后
if
(
scientificSignCount
>
0
)
{
flag
=
false
;
break
;
}
}
else
if
(
isScientificSign
(
ch
))
{
// [e,E] 不能出现在首位
if
(
0
==
i
)
{
flag
=
false
;
break
;
}
// [e,E] 不能出现在最后一位
if
(
i
==
(
len
-
1
))
{
flag
=
false
;
break
;
}
// 如果 [e,E] 在第二位, 首位必须是数字
if
(
1
==
i
&&
(
isPlusSign
(
prev
)
||
isSubstractSign
(
prev
)
||
isDotSign
(
prev
)
||
!
isdigit
(
prev
)))
{
flag
=
false
;
break
;
}
scientificSignIndex
=
i
;
scientificSignCount
+=
1
;
// 如果 [e,E] 存在, 则只能存在一个
if
(
scientificSignCount
>
1
)
{
flag
=
false
;
break
;
}
}
else
{
// 非法字符
flag
=
false
;
break
;
}
}
}
// 必须包含数字
if
(
0
==
digitCount
)
{
flag
=
false
;
}
return
flag
;
}
KHL_CALC_NAMESPACE_END
\ No newline at end of file
calc_lib/test/testmain.cpp
浏览文件 @
3697be00
...
...
@@ -4,6 +4,8 @@
#include <memory>
#include <cstring>
#include <sstream>
#include <cctype>
#include <vector>
#include "doctest/doctest.h"
#include "spdlog/spdlog.h"
...
...
@@ -15,10 +17,20 @@ TEST_CASE("test_init")
spdlog
::
info
(
"test init"
);
try
{
auto
d
ecimal
=
std
::
make_unique
<
khl
::
calc
::
Decimal
>
(
""
);
auto
d
1
=
std
::
make_unique
<
khl
::
calc
::
Decimal
>
(
""
);
}
catch
(
khl
::
calc
::
CalcDecimalInitException
e
)
catch
(
khl
::
calc
::
CalcDecimalInitException
e
)
{
std
::
cerr
<<
e
.
msg
()
<<
std
::
endl
;;
std
::
cerr
<<
e
.
msg
()
<<
std
::
endl
;
}
try
{
auto
d2
=
std
::
make_unique
<
khl
::
calc
::
Decimal
>
(
" "
);
}
catch
(
khl
::
calc
::
CalcDecimalInitException
e
)
{
std
::
cerr
<<
e
.
msg
()
<<
std
::
endl
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录