账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    MSSQL 如何实现 Excel中的 BathText() 函数功能
    76
    0

    问题描述

    要在sqlserve 中使用一个自定义函数来实现泰铢大写的输出,自己写了个自定义函数,但因不理解泰铢语法规则,总是会出错。

    问题出现的环境背景及自己尝试过哪些方法

    尝试过使用sql自定函数一个个数值进行处理,还出出现问题。
    发现js有实现这个功能的函数,单因sql无数组无法实现修改:
    https://github.com/jojoee/bah...

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    /*
    step:
    1. validate
    2. sanitize
    3. split
    4. proceed
    5. grammar
    6. combine
    */
    
    const defaultResult = 'ศูนย์บาทถ้วน'
    const singleUnitStrs = [
      '',
      'หนึ่ง',
      'สอง',
      'สาม',
      'สี่',
      'ห้า',
      'หก',
      'เจ็ด',
      'แปด',
      'เก้า'
    ]
    const placeNameStrs = [
      '',
      'สิบ',
      'ร้อย',
      'พัน',
      'หมื่น',
      'แสน',
      'ล้าน'
    ]
    
    /**
     * @param {number[]} nums
     * @returns {string}
     */
    function num2Word (nums) {
      let result = ''
      const len = nums.length
      const maxLen = 7
    
      if (len > maxLen) {
        // more than million
        const overflowIndex = len - maxLen + 1
        const overflowNums = nums.slice(0, overflowIndex)
        const remainingNumbs = nums.slice(overflowIndex)
        return num2Word(overflowNums) + 'ล้าน' + num2Word(remainingNumbs)
      } else {
        for (let i = 0; i < len; i++) {
          const digit = nums[i]
          if (digit > 0) {
            result += singleUnitStrs[digit] + placeNameStrs[len - i - 1]
          }
        }
      }
    
      return result
    }
    
    /**
     * @param {string} str
     * @returns {string}
     */
    function grammarFix (str) {
      let result = str
    
      // "สิบ"
      result = result.replace('หนึ่งสิบ', 'สิบ')
      // "ยี่สิบ"
      result = result.replace('สองสิบ', 'ยี่สิบ')
      // "เอ็ด"
      const neungLen = 5
      if (result.length > neungLen &&
        result.length - result.lastIndexOf('หนึ่ง') === neungLen) {
        result = result.substr(0, result.length - neungLen) + 'เอ็ด'
      }
    
      return result
    }
    
    /**
     * Combine baht and satang
     * and also adding unit
     *
     * @param {string} baht
     * @param {string} satang
     * @returns {string}
     */
    function combine (baht, satang) {
      let result = ''
    
      if (baht === '' && satang === '') {
        result = defaultResult
      } else if (baht !== '' && satang === '') {
        result = baht + 'บาท' + 'ถ้วน'
      } else if (baht === '' && satang !== '') {
        result = satang + 'สตางค์'
      } else {
        result = baht + 'บาท' + satang + 'สตางค์'
      }
    
      return result
    }
    
    /**
     * Change number to Thai pronunciation string
     *
     * @param {number} num
     * @returns {string}
     */
    function bahttext (num) {
      let result = defaultResult
    
      // 1. validate: invalid number
      if (isNaN(num)) return result
      // 1. validate: more than
      if (num >= Number.MAX_SAFE_INTEGER) return result
    
      // 2. sanitize: ????
    
      // 3. split: baht and satang
      // e.g. 432.21 >> 432, 21
      // @todo optimize
      /** @type {string} */
      const bahtStr = Math.floor(num).toString()
      /** @type {string} */
      const satangStr = Math.round(num % 1 * 100).toString()
    
      // 3. split: convert number array
      // @todo optimize it
      /** @type {number[]} */
      const bahtArr = Array.from(bahtStr).map(Number)
      /** @type {number[]} */
      const satangArr = Array.from(satangStr).map(Number)
    
      // 4. proceed
      let baht = num2Word(bahtArr)
      let satang = num2Word(satangArr)
    
      // 5. grammar
      baht = grammarFix(baht)
      satang = grammarFix(satang)
    
      // 6. combine
      result = combine(baht, satang)
    
      return result
    }
    
    if (typeof module !== 'undefined' &&
      module.exports != null) {
      module.exports = bahttext
    }

    ---js

    你期待的结果是什么?实际看到的错误信息又是什么?

    哪位大神是否可提供相关的思路或者参考材料?
    能实现在sql中定义一个自定义函数,输出泰文大写金额即可,不一定参照上面js的代码来写。

    谢谢。

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 十年卧雪 普通会员 1楼

      在 Microsoft SQL Server 中,可以使用内置的 "BathText" 函数来实现 Excel 中的 BathText() 函数功能。BathText() 函数可以将字符串中的空格替换为下划线,以实现文本的转义。

      以下是一个简单的示例:

      sql SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('BathText("Hello World"), ' ', -1), ' ', 1) AS Title, SUBSTRING_INDEX(SUBSTRING_INDEX('BathText("Hello World"), ' ', -1), ' ', -2) AS Description, SUBSTRING_INDEX(SUBSTRING_INDEX('BathText("Hello World"), ' ', -1), ' ', -3) AS Email FROM YourTable;

      在这个示例中,我们首先使用 "SUBSTRING_INDEX" 函数找到 BathText 函数中的空格,并将它们替换为下划线。然后,我们使用另一个 "SUBSTRING_INDEX" 函数来找到空格,以得到每个文本字段的标题、描述和电子邮件地址。

      注意,这个示例假设你的 BathText 函数在数据库中有一个名为 "BathText" 的函数,且它接受一个参数。你需要将 "YourTable" 替换为你的表名,将 "BathText" 替换为你的 BathText 函数名。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部