博客 / 詳情

返回

js精準的時間處理成範圍時間

例如:3小時,處理為 2~3.5小時
遇到範圍時間(2~3.5小時)則不處理,僅處理精準時間
並且可以多次處理,適用與流式對話以及普通文本處理

/**
 * 精準的時間處理成範圍時間,規則:下限 = 原數 - 1,上限 = 原數 + 0.5
 * @param text 文本
 * @returns 處理後的文本
 */
export const processHoursText = (text: string) => {
  // 步驟1:提取所有時間範圍並替換為臨時標記,避免被處理
  const rangeRegex = /\d+(\.\d+)?~(\d+(\.\d+)?)(個)?小時/g;
  const ranges: any = [];
  let tempText = text.replace(rangeRegex, match => {
    ranges.push(match);
    return `__RANGE_${ranges.length - 1}__`; // 生成唯一佔位符
  });

  // 步驟2:處理剩餘的單獨時間
  const singleTimeRegex = /(?<!~|\d)(\d+(\.\d+)?)(個)?小時(?!~|\d)/g;
  tempText = tempText.replace(singleTimeRegex, (_, numberStr) => {
    const number = parseFloat(numberStr);
    const lower = number - 1;
    const upper = number + 0.5;

    // 格式化輸出,移除不必要的.0
    const formatNumber = (num: any) => {
      return num % 1 === 0 ? num.toString() : num.toFixed(1);
    };

    return `${formatNumber(lower)}~${formatNumber(upper)}個小時`;
  });

  // 步驟3:恢復之前提取的時間範圍
  ranges.forEach((range: any, index: any) => {
    tempText = tempText.replace(`__RANGE_${index}__`, range);
  });
  return tempText;
};
// 測試用例
let text = "測試文本:3個小時,4.5個小時,2.5~4個小時,4~5.5個小時,6";
console.log("處理前:", text);
text = processHoursText(text);
console.log("處理後:", text);
// 預期:測試文本:2~3.5個小時,3.5~5個小時,2.5~4個小時,4~5.5個小時

// 再次處理測試(關鍵測試)
text = processHoursText(text);
console.log("再次處理後:", text);
// 預期:與上一次結果完全相同,沒有變化

// 新增內容測試
text += "個小時,7.8小時,9~10.5個小時,11個小時";
console.log("新增後:", text);
text = processHoursText(text);
console.log("處理新增後:", text);
// 預期包含:5~6.5個小時,6.8~8.3個小時,9~10.5個小時,10~11.5個小時

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.