For loop 将非标准字符串转换为十进制

For loop 将非标准字符串转换为十进制,for-loop,coldfusion,switch-statement,For Loop,Coldfusion,Switch Statement,我的表中有一列名为time_required。包含30min、1H、3h、5-6H、1/2天等字符串。。一串不标准的弦 我需要将这些字符串转换为十进制值以标准化该表 30分钟将变成0.5分钟, 1H将变为1 3小时将变成3小时 5-6H将变为5、5.5或6 到目前为止,对于某些值,如1/2天,我做了一个开关盒,并简单地进行了转换: <cffunction name="updateRealTime"> <cfargument name="priorityID" requi

我的表中有一列名为time_required。包含30min、1H、3h、5-6H、1/2天等字符串。。一串不标准的弦

我需要将这些字符串转换为十进制值以标准化该表

30分钟将变成0.5分钟, 1H将变为1 3小时将变成3小时 5-6H将变为5、5.5或6 到目前为止,对于某些值,如1/2天,我做了一个开关盒,并简单地进行了转换:

<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>
这是相当容易和快速,因为我只有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>
运行的输出将为您提供:

30分钟是30分钟,也就是0.5小时

1小时30分钟是90分钟,也就是1.5小时

3小时30米等于210分钟,也就是3.5小时

1小时15分钟是75分钟,也就是1.25小时

5天6小时45分钟等于7605分钟,即126.75小时


我选择的方法是将它转换为总分钟数,从那里我可以转换为任何我想要的。希望这足够让你开始了。

所以我想我应该试一试,因为这听起来像是一个有趣的问题!以下是我的想法:

<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>
运行的输出将为您提供:

30分钟是30分钟,也就是0.5小时

1小时30分钟是90分钟,也就是1.5小时

3小时30米等于210分钟,也就是3.5小时

1小时15分钟是75分钟,也就是1.25小时

5天6小时45分钟等于7605分钟,即126.75小时


我选择的方法是将它转换为总分钟数,从那里我可以转换为任何我想要的。希望这足以让您开始学习。

我建议将翻译存储在某个位置,以便在突然出现新值时不必更新编程代码。我建议将翻译存储在某个位置,以便在突然出现新值时不必更新编程代码。Genius。比我的开关箱短了很多,有50个不同的箱子!非常感谢。天才比我的开关箱短了很多,有50个不同的箱子!非常感谢。