- 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 条
- 全部回答
-
十年卧雪 普通会员 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 函数名。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
