gpt4 book ai didi

MySQL自定义函数将罗马数字转换为阿拉伯数字

转载 作者:行者123 更新时间:2023-11-29 01:10:22 25 4
gpt4 key购买 nike

好的,我需要一个可以转换罗马数字字符串的 MySQL 函数:

例如XXCVI

转换为等效的阿拉伯数字。至于我为什么需要它,说来话长,我就是需要。

基于某人发布的 PHP 函数,我创建了以下 MySQL 函数,但它似乎无休止地运行,我不确定为什么。 (我可能只是太累了)

有人对我的函数有什么问题有任何提示,或者有更有效的方法将罗马数字字符串转换为阿拉伯数字吗?

DROP FUNCTION IF EXISTS `romeToArabic`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `romeToArabic`(roman_in VARCHAR(64)) RETURNS int(11)
BEGIN
DECLARE numeral VARCHAR(2);
DECLARE int_val INT;
DECLARE roman VARCHAR(64);
DECLARE res INT;
DECLARE no_more_rows BOOLEAN;
DECLARE num_rows INT DEFAULT 0;
DECLARE roman_cur CURSOR FOR SELECT num, val FROM roman_numeral ORDER BY id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;
SET roman = UPPER(roman_in);
SET res = 0;

DROP TEMPORARY TABLE IF EXISTS roman_numeral;
CREATE TEMPORARY TABLE roman_numeral (
`id` INT(8) NOT NULL AUTO_INCREMENT,
`num` varchar(2) DEFAULT NULL,
`val` int(8) NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM;

INSERT INTO roman_numeral (num, val) VALUES ('M', 1000), ('CM', 900), ('D', 500), ('CD', 400), ('C', 100), ('XC', 90), ('L', 50), ('XL', 40), ('X', 10), ('IX', 9), ('V', 5), ('IV', 4), ('I', 1);

OPEN roman_cur;
SELECT FOUND_ROWS() INTO num_rows;

the_loop:
LOOP
FETCH roman_cur INTO numeral, int_val;
IF no_more_rows THEN CLOSE roman_cur;
LEAVE the_loop;
END IF;

WHILE INSTR(roman, numeral) = 1 DO
SET res = res + int_val;
SET roman = SUBSTRING(roman, LENGTH(numeral));
END WHILE;

END LOOP the_loop;
IF res > 0 THEN
RETURN res;
ELSE
RETURN -1;
END IF;
END$$

最佳答案

不知道为什么你不工作,但谷歌搜索速度很快,我想到了这个链接:

http://forge.mysql.com/tools/tool.php?id=107

CREATE FUNCTION fromRoman (inRoman varchar(15)) RETURNS integer DETERMINISTIC
BEGIN

DECLARE numeral CHAR(7) DEFAULT 'IVXLCDM';

DECLARE digit TINYINT;
DECLARE previous INT DEFAULT 0;
DECLARE current INT;
DECLARE sum INT DEFAULT 0;

SET inRoman = UPPER(inRoman);

WHILE LENGTH(inRoman) > 0 DO
SET digit := LOCATE(RIGHT(inRoman, 1), numeral) - 1;
SET current := POW(10, FLOOR(digit / 2)) * POW(5, MOD(digit, 2));
SET sum := sum + POW(-1, current < previous) * current;
SET previous := current;
SET inRoman = LEFT(inRoman, LENGTH(inRoman) - 1);
END WHILE;

RETURN sum;
END

关于MySQL自定义函数将罗马数字转换为阿拉伯数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8004959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com