将非标准化字符串转换为十进制
Convert unstandardized strings to decimal
我的 table 中有一个名为 time_required
的专栏。包含30min, 1H, 3 H, 5-6H,1/2 Day等字符串。一堆不规范的字符串。
我需要将这些字符串转换为十进制值以标准化 table
- 30分钟会变成0.5,
- 1H 会变成 1
- 3 H 会变成 3
- 5-6H 会变成 5 、 5.5 或 6
到目前为止,对于像 1/2 Day 这样的特定值,我做了一个 switch case 并简单地转换为:
<cffunction name="updateRealTime">
<cfargument name="priorityID" required="yes">
<cfargument name="realTime" required="yes">
<cfquery name="qryPriorityList" datasource="NTCBF_PORTAL">
UPDATE tblPriorityList
SET real_time = #arguments.realTime#
WHERE priority_id = #arguments.priorityID#
</cfquery>
</cffunction>
<cfquery name="qry" datasource="#dsn#">
<!--- not actual query --->
SELECT * from tbl
</cfquery>
<cfloop query="qry">
<cfswitch expression="qry.time_required">
<!--- 1/2 DAY --->
<cfcase value="1/2 Day">
<cfset convertedTime = 4>
</cfcase>
<!--- more cases --->
...
<cfset updateToRealTime(qry.ID,convertedTime)>
</cfswitch>
</cfloop>
这非常简单快捷,因为我的 table 中只有 6 个不同的案例。
现在,真正的挑战是其他 52 个不同的条目(1 小时,30 分钟,3 小时,...)。
对我来说,像上面这样的切换案例并枚举每个可能的案例来进行转换会更快,还是有一种更简单的方法来转换所有这些数据?
谢谢!
所以我想我应该试一试,因为这听起来是个有趣的问题!这是我想出的:
<cfscript>
examples = [
'30min',
'1H 30minutes',
'3 h 30 m',
'1h 15m',
'5 days 6 Hours 45 minutes'
];
for (it in examples) {
minutes = 0;
parts = rematchnocase('\d+ ?(d|h|m)', lcase(it));
for (part in parts) {
amount = reReplace(part, '[^0-9]', '', 'all');
if (find('m', part)) {
minutes += amount;
} else if (find('h', part)) {
minutes += amount * 60;
} else if (find('d', part)) {
minutes += amount * (60 * 24);
}
}
fraction = (minutes % 60) / 60;
hours = int(minutes / 60);
decimal = hours + fraction;
writeOutput('#it# is #minutes# minutes, which is #decimal# hours<br>');
}
</cfscript>
运行 的输出为您提供:
30min is 30 minutes, which is 0.5 hours
1H 30minutes is 90 minutes, which is 1.5 hours
3 h 30 m is 210 minutes, which is 3.5 hours
1h 15m is 75 minutes, which is 1.25 hours
5 days 6 Hours 45 minutes is 7605 minutes, which is 126.75 hours
我选择的方法是将它转换为总分钟数,然后我可以转换为任何我想要的。希望这足以让您入门。
我的 table 中有一个名为 time_required
的专栏。包含30min, 1H, 3 H, 5-6H,1/2 Day等字符串。一堆不规范的字符串。
我需要将这些字符串转换为十进制值以标准化 table
- 30分钟会变成0.5,
- 1H 会变成 1
- 3 H 会变成 3
- 5-6H 会变成 5 、 5.5 或 6
到目前为止,对于像 1/2 Day 这样的特定值,我做了一个 switch case 并简单地转换为:
<cffunction name="updateRealTime">
<cfargument name="priorityID" required="yes">
<cfargument name="realTime" required="yes">
<cfquery name="qryPriorityList" datasource="NTCBF_PORTAL">
UPDATE tblPriorityList
SET real_time = #arguments.realTime#
WHERE priority_id = #arguments.priorityID#
</cfquery>
</cffunction>
<cfquery name="qry" datasource="#dsn#">
<!--- not actual query --->
SELECT * from tbl
</cfquery>
<cfloop query="qry">
<cfswitch expression="qry.time_required">
<!--- 1/2 DAY --->
<cfcase value="1/2 Day">
<cfset convertedTime = 4>
</cfcase>
<!--- more cases --->
...
<cfset updateToRealTime(qry.ID,convertedTime)>
</cfswitch>
</cfloop>
这非常简单快捷,因为我的 table 中只有 6 个不同的案例。 现在,真正的挑战是其他 52 个不同的条目(1 小时,30 分钟,3 小时,...)。 对我来说,像上面这样的切换案例并枚举每个可能的案例来进行转换会更快,还是有一种更简单的方法来转换所有这些数据?
谢谢!
所以我想我应该试一试,因为这听起来是个有趣的问题!这是我想出的:
<cfscript>
examples = [
'30min',
'1H 30minutes',
'3 h 30 m',
'1h 15m',
'5 days 6 Hours 45 minutes'
];
for (it in examples) {
minutes = 0;
parts = rematchnocase('\d+ ?(d|h|m)', lcase(it));
for (part in parts) {
amount = reReplace(part, '[^0-9]', '', 'all');
if (find('m', part)) {
minutes += amount;
} else if (find('h', part)) {
minutes += amount * 60;
} else if (find('d', part)) {
minutes += amount * (60 * 24);
}
}
fraction = (minutes % 60) / 60;
hours = int(minutes / 60);
decimal = hours + fraction;
writeOutput('#it# is #minutes# minutes, which is #decimal# hours<br>');
}
</cfscript>
运行 的输出为您提供:
30min is 30 minutes, which is 0.5 hours
1H 30minutes is 90 minutes, which is 1.5 hours
3 h 30 m is 210 minutes, which is 3.5 hours
1h 15m is 75 minutes, which is 1.25 hours
5 days 6 Hours 45 minutes is 7605 minutes, which is 126.75 hours
我选择的方法是将它转换为总分钟数,然后我可以转换为任何我想要的。希望这足以让您入门。