Kohli finished with 103 not out off 97 balls as India finished with 261-3 (41.3 overs) in reply to Bangladesh’s sub-par 256-8 (50 overs). He had some help at the other end from Lokesh Rahul, who finished with 34 not out.
Kohli is now one short of compatriot Sachin Tendulkar’s world record of 49 ODI hundreds. Across formats it was his 78th international century but just his third in World Cups since 2011.
India stay second in the points table with eight points from four games, trailing New Zealand on net run-rate. The two teams will face each other in Dharamsala on Sunday.
“I wanted to make a big contribution today,” Kohli said. “I have a few half-centuries in World Cups but didn’t convert them. I wanted to finish off things today and stay till the end.”
The man of the match said it’s a “special feeling” to play the tournament in India. The MCA Stadium was at full capacity with 33,610 fans.
Bangladesh stay seventh with just two points from one win in four games.
Earlier, opting to bat, Bangladesh got off to a great start on a batting friendly surface. Tanzid Hasan, who was on the verge of being left out from this game, scored a maiden ODI half-century instead.
Together with Litton Das, he put on 93 runs off 88 balls for the first wicket.
For India, there was another cause for concern as well. All-rounder Hardik Pandya hobbled off in the ninth over with a twisted left ankle. He was trying to field off his bowling as Das struck a boundary.
Pandya was taken for scans at a local medical facility. Surprisingly, Kohli completed that ninth over, albeit bowling just those three deliveries.
Pandya did not bowl or field for the remainder of the game, and he was not padded up while India chased down Bangladesh’s total.
“He pulled up a bit sore and there is nothing major to worry (about),” Indian skipper Rohit Sharma said. “We will see how he pulls up (tomorrow) and then plan on how to go forward.”
Bowling all-rounder Shardul Thakur (1-59) stepped up, but he didn’t provide the same control that Pandya often does. Hasan scored 50 off 41 balls, hitting five fours and three sixes.
Instead, wrist spinner Kuldeep Yadav provided the breakthrough, trapping Hasan lbw in the 15th over. India etched out three more wickets for just 44 runs and reduced Bangladesh to 137-4 in 27.4 overs.
While Yadav provided control from one end, left-arm spinner Ravindra Jadeja inflicted more damage. First he trapped stand-in skipper Najmul Hossain Shanto lbw for eight runs. Then, he dismissed Das, who scored 66 off 82 balls with seven fours.
In between, Mehidy Hasan Miraz was surprisingly promoted but wicketkeeper Rahul took a diving catch to his left and sent him back for three runs.
Veteran Mushfiqur Rahim stabilized the innings with 38 off 46 balls. He put on 42 runs with Towhid Hridoy for the fifth wicket. Hridoy was caught off Thakur for 16 runs.
Rahim then put on 22 runs with Mahmudullah, before a stunning one-handed catch at point from Jadeja off Bumrah sent him back.
Mahmudullah guided the lower-order and top-scored with 46 off 36 balls. He hit three fours and three sixes. His most vital partnership was worth 32 off 26 balls with Nasum Ahmed (14).
He helped Bangladesh cross the 250-mark, even if it fell short of a par score on a great batting wicket.
In reply, the Indian openers sped off the block. Rohit Sharma and Shubman Gill added 88 off 76 balls.
The skipper led the charge initially, and he scored 48 off 40 balls, with seven fours and two sixes. The second of those sixes was a towering pull shot off Hasan Mahmud over the square leg fence in the 13th over, but he was caught next ball trying to replicate it.
Gill scored his maiden World Cup half-century off 52 balls, hitting five fours and two sixes. He scored 53 runs in all and added 44 off 42 balls for the second wicket with Kohli.
He holed out at the deep midwicket fence against the run of play. Kohli though took over charge of the innings there onward and Bangladesh never got a sniff. He added 46 runs off 59 balls for the third wicket with Shreyas Iyer (19).
Iyer holed out to the deep. Kohli reached 50 off 48 balls, and then marched toward a landmark hundred.
Kohli and Rahul added an unbeaten 83 runs off 74 balls for the fourth wicket.
With a couple of extras thrown in, it seemed like Kohli could miss his chance. But he bided his time and slammed a full toss from Nasum Ahmed into the crowd, kicking off celebrations in Pune.
Bangladesh next play South Africa in Mumbai on Monday.